お互いに文字列メッセージを送信できるUDPクライアント/サーバーモデルを設定しました。udpを介して送信した後、シリアル化されたオブジェクトにヌル値があります
カスタムクラスLoginRequestを作成しました。このカスタムクラスはシリアル化され、ユーザー名とパスワードを含むサーバーに送信されます。これらの変数のgetterが呼び出されると、LoginRequestが送信される前に変数をチェックしてもnull値が返されます。ここで
は、クライアントからのデータグラムをシリアル化して送信するためのコードです:ここで
private void login(String name, char[] pass) throws SQLException {
try {
LoginRequest login = new LoginRequest(name, pass);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(login);
byte[] buffer= baos.toByteArray();
oos.close();
baos.close();
DatagramPacket packet =
new DatagramPacket(buffer, buffer.length, InetAddress.getByName(SERVER), 10110);
DatagramSocket sSocket = new DatagramSocket();
sSocket.send(packet);
login.getUsername();
} catch (Exception e) {
e.printStackTrace();
}
}
は、デシリアライズLoginRequestをして、ユーザー名を読み込むためのコードは次のとおりです。ここで
private void readMessage() {
try {
ByteArrayInputStream bais = new ByteArrayInputStream(cPacket.getData());
ObjectInputStream ois = new ObjectInputStream(bais);
Object obj = ois.readObject();
bais.close();
ois.close();
if(obj instanceof LoginRequest) {
System.out.println("Login request");
LoginRequest login = (LoginRequest) obj;
login.getUsername();
} else {
System.out.println("Not a login request");
}
} catch (Exception e) {
e.printStackTrace();
}
}
はコードですLoginRequestの場合:
public class LoginRequest implements Serializable {
/**
*
*/
private static final long serialVersionUID = -1379800611469143228L;
private static String username;
private static char[] password;
public LoginRequest(String name, char[] pass) {
username = name;
password = pass;
}
public String getUsername() {
System.out.println("Username: " + username);
return username;
}
public char[] getPassword() {
String p = password.toString();
System.out.println("Password: " + p);
return password;
}
}
私はユーザー名またはパスワードを解除すると、NullPointerExceptionが発生します。誰かが私を正しい方向に向けることができれば、とても幸せになれます。
LoginRequestのコードを入力できますか?あなたのNPEはどこにありますか?私はあなたのコードでそれを見つけることができません。最後に、これは明らかですが、送信側で名前とパスワードが空でないことを確認しましたか? –
ユーザー名とパスワードはサーバー側ではnullですが、クライアント側で正しい値を指定するため、getPassword()を呼び出すとNPEが取得されます。 getUsername()はヌル値を返します。 – MachoChild