2012-03-09 8 views
0

お互いに文字列メッセージを送信できる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が発生します。誰かが私を正しい方向に向けることができれば、とても幸せになれます。

+0

LoginRequestのコードを入力できますか?あなたのNPEはどこにありますか?私はあなたのコードでそれを見つけることができません。最後に、これは明らかですが、送信側で名前とパスワードが空でないことを確認しましたか? –

+0

ユーザー名とパスワードはサーバー側ではnullですが、クライアント側で正しい値を指定するため、getPassword()を呼び出すとNPEが取得されます。 getUsername()はヌル値を返します。 – MachoChild

答えて

1

あなたの属性のユーザー名とパスワードにstaticをドロップしてください!

+0

賢い、助けてくれてありがとう。 – MachoChild

+0

あなたは歓迎ですが、 'static 'が意味することは、おそらくあなたの場合に使用する意味がないので、たぶん学ぶべきです。 –

0

代わりに、一般的なオブジェクトとしてあなたLoginRequstを読んで、あなたはこのようにそれを行うことができます。

LoginRequest loginRequest = (LoginRequest)ois.readObject(); 

あなたはまた、あなたのLoginRequestクラス内のreadObject()メソッドをオーバーライドすることができます。 readObjectメソッドは、シリアライズした特定のクラスのオブジェクトの状態の読み取りと復元を行うためです。私はあなたに考える方向を与えています。

+0

ClassCastExceptionが発生する危険性があります。 –

関連する問題