Hey, ich hab mal wieder ein schönes Problem mit meinem netzwerk. Und zwar, habe ich eine Request-Klasse, die eine Map mit Serializable Parametern erhält. Diese Map befülle ich und schicke diese an den Server. Dieser identifiziert die Request und kreiert eine neue mit neuen Parametern und schickt diese zurück an den Client. Allerdings erhält der Client, wenn ich das mache immer eine null-Instanz.
[Java=42]
import java.io.Serializable;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class Request implements Serializable {
private static final long serialVersionUID = 2208321882854260740L;
//! Gets the Type of this Request
private final RequestType type;
//! Gets the parameters of this request
private final Map<String, Serializable> params;
public Request(RequestType type) {
this.type = type;
this.params = new HashMap<String, Serializable>();
}
.... // Das ist im Prinzip die Request Klasse und im Folgenden beim Server:
public void identifyRequest(Request r){
switch(r.getType()){
case LOGIN
ns.sendMessage(Classroom.sql.getUserInstance( (String)r.get(RequestKey.USERNAME),
(String)r.get(RequestKey.PASSWORD) ));
break;
case REGISTER:
ns.sendMessage(Classroom.sql.register ( (String)r.get(RequestKey.USERNAME),
(String)r.get(RequestKey.PASSWORD) ) );
break;
}
// Hier ist schonmal der lustige Teil, dass es bei dem REGISTER funktioniert, nur beim LOGIN nicht...
// aus der SQL-Klasse
public synchronized static Request getUserInstance(String name, String password){
Request rt = new Request(RequestType.LOGIN);
ResultSet result;
User user = null;
try{
result = stmt.executeQuery( "Select * from User where name = '"+name+"'");
if(result.next()){
if( !password.equals( result.getString(4) ) ){
rt.set(RequestKey.ACCEPT,false);
String error = "The password was not correct, please try again";
rt.set(RequestKey.ERRORMESSAGE,error);
}else{
rt.set(RequestKey.ACCEPT,true);
user = new User( result.getLong(1), // the user ID
result.getLong(3), // the points of this user
result.getString(2), // the userName
result.getString(5), // the real name of this user
result.getString(6), // the email
result.getString(7), // the country
result.getString(8) // the comments
);
}
}else{
rt.set(RequestKey.ACCEPT,false);
String error = "A user with this name does not exist!";
rt.set(RequestKey.ERRORMESSAGE,error);
}
}catch(SQLException ex){ JOptionPane.showMessageDialog( new JFrame(),
ex.getMessage()); }
rt.set(RequestKey.USER,user);
return rt;
}
[/code]
Also gibt die Funktion eine einfache Request mit den gewünschten Paramtern zurück. Ich hab auch schon Testausgaben gemacht vor dem case LOGIN
ns.sendMessage(Classroom.sql.getUserInstance( (String)r.get(RequestKey.USERNAME),
(String)r.get(RequestKey.PASSWORD) ));
break;
indem ich die Request erst in eine entsprechende Instanz gepackt habe und dann abgefragt habe, ob auch alle Werte, die ich aben will drinnen sind, was sie waren. Erst wenn es beim Client ankommt, ist das ganze plötzlich null... hat jemand ne Idee?
EDIT: Ich habe gerade festgestellt, dass es an der User Instanz liegen muss. Wenn ich diese nicht mit in die Request setze, funktioniert es. Allerdings finde ich das etwas seltsam, und ich möchte nur ungern immer nur die primitiven senden... weiß jemand woran das liegt und was man dagegen machenn kann?
[Java=42]
import java.io.Serializable;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class Request implements Serializable {
private static final long serialVersionUID = 2208321882854260740L;
//! Gets the Type of this Request
private final RequestType type;
//! Gets the parameters of this request
private final Map<String, Serializable> params;
public Request(RequestType type) {
this.type = type;
this.params = new HashMap<String, Serializable>();
}
.... // Das ist im Prinzip die Request Klasse und im Folgenden beim Server:
public void identifyRequest(Request r){
switch(r.getType()){
case LOGIN
ns.sendMessage(Classroom.sql.getUserInstance( (String)r.get(RequestKey.USERNAME),
(String)r.get(RequestKey.PASSWORD) ));
break;
case REGISTER:
ns.sendMessage(Classroom.sql.register ( (String)r.get(RequestKey.USERNAME),
(String)r.get(RequestKey.PASSWORD) ) );
break;
}
// Hier ist schonmal der lustige Teil, dass es bei dem REGISTER funktioniert, nur beim LOGIN nicht...
// aus der SQL-Klasse
public synchronized static Request getUserInstance(String name, String password){
Request rt = new Request(RequestType.LOGIN);
ResultSet result;
User user = null;
try{
result = stmt.executeQuery( "Select * from User where name = '"+name+"'");
if(result.next()){
if( !password.equals( result.getString(4) ) ){
rt.set(RequestKey.ACCEPT,false);
String error = "The password was not correct, please try again";
rt.set(RequestKey.ERRORMESSAGE,error);
}else{
rt.set(RequestKey.ACCEPT,true);
user = new User( result.getLong(1), // the user ID
result.getLong(3), // the points of this user
result.getString(2), // the userName
result.getString(5), // the real name of this user
result.getString(6), // the email
result.getString(7), // the country
result.getString(8) // the comments
);
}
}else{
rt.set(RequestKey.ACCEPT,false);
String error = "A user with this name does not exist!";
rt.set(RequestKey.ERRORMESSAGE,error);
}
}catch(SQLException ex){ JOptionPane.showMessageDialog( new JFrame(),
ex.getMessage()); }
rt.set(RequestKey.USER,user);
return rt;
}
[/code]
Also gibt die Funktion eine einfache Request mit den gewünschten Paramtern zurück. Ich hab auch schon Testausgaben gemacht vor dem case LOGIN
ns.sendMessage(Classroom.sql.getUserInstance( (String)r.get(RequestKey.USERNAME),
(String)r.get(RequestKey.PASSWORD) ));
break;
indem ich die Request erst in eine entsprechende Instanz gepackt habe und dann abgefragt habe, ob auch alle Werte, die ich aben will drinnen sind, was sie waren. Erst wenn es beim Client ankommt, ist das ganze plötzlich null... hat jemand ne Idee?
EDIT: Ich habe gerade festgestellt, dass es an der User Instanz liegen muss. Wenn ich diese nicht mit in die Request setze, funktioniert es. Allerdings finde ich das etwas seltsam, und ich möchte nur ungern immer nur die primitiven senden... weiß jemand woran das liegt und was man dagegen machenn kann?
Zuletzt bearbeitet: