2012-03-09 1 views
0

서로 문자열 메시지를 보낼 수있는 UDP 클라이언트/서버 모델을 설정했습니다.udp를 통해 전송 한 후 직렬화 된 객체에 null 값이 있음

사용자 이름과 비밀번호가 포함 된 서버로 일련 번호가 지정된 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; 
} 
} 

사용자 이름 또는 비밀 번호를이 deserialization 후 NullPointerException 얻을. 누군가가 올바른 방향으로 나를 가리킬 수 있다면 나는 매우 행복해 할 것입니다.

+0

LoginRequest 코드를 넣을 수 있습니까? 그리고 귀하의 NPE는 어디에서 발생합니까, 귀하의 코드에서 찾을 수 없습니다. 마지막으로, 그러나 이것이 명백합니다. 보내는 쪽에서 이름과 암호가 비어 있지 않은지 확인 했습니까? –

+0

서버 측에서 사용자 이름과 비밀번호가 null이지만 클라이언트 측에서 올바른 값을 제공하면 getPassword()를 호출 할 때 NPE가 표시됩니다. getUsername()은 null 값을 반환합니다. – MachoChild

답변

1

당신의 특성 usename과 암호에 static를 버리십시오!

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

당신은 또한 당신의 LoginRequest 클래스에서의 readObject() 메소드를 오버라이드 (override) 할 수 있습니다

+0

훌륭하게 도와 줘서 고마워. – MachoChild

+0

당신은 환영 할 만하다. 그렇지만'정적'이 의미하는 것은 당신의 경우에 그것을 사용하는 것이 절대적으로 의미가 없기 때문에 아마 무엇을 배워야한다. –

0

대신 일반 객체로 LoginRequst를 읽고, 당신은 이런 식으로 할 수 있습니다. readObject 메소드는 직렬화 한 특정 클래스의 객체 상태를 읽고 복원하는 역할을하기 때문에 나는 당신에게 생각할 방향을 제시하고 있습니다.

+0

ClassCastException이 발생할 위험이 있습니다. –

관련 문제