2011-10-19 1 views
2

이 문제로 인해 벽이 날 것입니다. 이것은 매우 내가 현재 일하고있는 간단한 온라인 멀티 플레이어 게임을위한 것입니다.UDP를 통해 클라이언트에서 자바로 전송 된 후 직렬화 된 객체에 null 값이 있습니다.

현재 udp를 통해 내 고객에게 패킷을 보낼 수 있으며 제대로 수신 한 것으로 보입니다. 그러나 클라이언트에 직렬화 된 객체를 보내고 반대쪽에서 deserialize 할 때 필요한 값에 액세스하려고하면 NullPointerExceptions이 발생합니다. 객체가 서버 측에서 올바르게 직렬화되고 있는지 확인 했으므로 (데이터를 직렬화 해제하고 데이터를 확인한 결과) 패킷을 전송하는 코드가 매우 잘못 처리되고 있음을 99 % 확신합니다. 여기

은 직렬화 및 서버에서 "데이터 그램"객체를 전송하기위한 코드이다

DatagramPacket sendPacket = null; 

    byte[] buf = null; 

    //Serialize the datagram object to send as a UDP packet 
    try { 

     // Serialize to a byte array 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     ObjectOutput out = new ObjectOutputStream(bos); 
     out.writeObject(data); 
     buf = bos.toByteArray(); 

     out.close(); 
     bos.close(); 

    } catch (IOException e) { 
    } 

    try { 
     sendPacket = new DatagramPacket(buf, buf.length, 
       InetAddress.getLocalHost(), 4004); 
    } catch (UnknownHostException e){} 

    try { 
     DatagramSocket sendSocket = new DatagramSocket(); 
     sendSocket.send(sendPacket); 
     changed = true; 
    }catch (IOException e) {} 

"데이터는"객체 직렬화가 올바른 값 가득; 나는 이것에 확신한다. 나는이 직렬화 복원 후 어떤 값을 읽으려고 할 때, 나는 NullPointerException이 얻을

public Datagram readDatagram() { 

    byte[] buff = new byte[20000]; 
    DatagramPacket packet = new DatagramPacket(buff, buff.length); 
    DatagramSocket receiver = null; 

    try { 
     receiver = new DatagramSocket(4004); 
     receiver.receive(packet); 
    } catch (IOException e) { 
     System.out.println("ERROR2"); 
    } 

    Datagram data = null;// = new Datagram(); 

    try { 
     // Deserialize from a byte array 
     ByteArrayInputStream bis = new ByteArrayInputStream(buff); 
     ObjectInput in = new ObjectInputStream(bis); 
     data = (Datagram) in.readObject(); 

     bis.close(); 
     in.close(); 
    } catch (ClassNotFoundException e) { 
    } catch (IOException e) { 
     System.out.println("ERROR3"); 
    } 

    for (int i = 0; i < 35; i++) { 
     System.out.print(data.getLevel()[i]); 
    } 

    receiver.close(); 

    return data; 

} 

:

다른 관련 코드 블록은 클라이언트 측에서 수신 블록이다. 누군가가 올바른 방향으로 나를 가리킬 수 있다면 나는 매우 행복해 할 것입니다.

아, 지금은 의도적으로 문제를 테스트하기 위해 localHost로 보냅니다. 내 클라이언트와 서버가 모두 내 컴퓨터에서 실행 중입니다.

답변

2

보내는 쪽과받는 쪽 모두에서 예외를 포착하고 스쿼시하고 있습니다. 이 문제를 진단하는 데 도움이되는 증거를 숨길 가능성이 큽니다. 이것이 사실이 아니더라도, 그런 예외를 스쿼시하는 것은 위험한 습관입니다.

수신 최종 코드에 ClassNotFoundException이 던져지고 있습니다. 그러면 data == null이 나올 것이고 그러면 다음 루프에서 NPE가 발생합니다.

out.writeObject(data); 
buf = bos.toByteArray(); 

out.close(); 
bos.close(); 

직렬화 된 데이터의 일부가 close() 때까지 출력 스트림에 기록되지 않은 경우,이 경우 손실됩니다 : 당신의 코드

+0

헤드 업에 감사드립니다. 예외에 고유 한 인쇄물을 추가했지만 아직이 문제를 해결하기 위해 더 이상 나지 않습니다. – araisbec

+0

내기에 옳았습니다. 나는 이제부터 내 예외 사항을 적절히 처리하는 것에 대한 조언을 확실히 할 것이다. 자, 내가 왜 그 예외를받을 것이라고 생각하니? 데이터 그램은 내가 만든 클래스이고 소스 파일은 내 소스 디렉토리에 있습니다. (Netbeans에 있습니다.) ... 객체를 만들 수도 있습니다. – araisbec

+0

당신은 남자입니다. 나는이 문제를 추구하고 다른 게시물을 읽음으로써 실제로 문제를 발견했습니다. Datagram 클래스의 추가 * 복사본 *을 사용하여 서버 측에서 객체를 만들었지 만 다른 * 패키지 이름 *. 나는 그것이 그 감동적인 것을 전혀 몰랐다. – araisbec

2

한 가지 문제는 당신이 ObjectOutputStream을 닫기 전에 toByteArray()를 호출 할 것입니다. 스트림을 닫은 후 toByteArray()에 연락하십시오.

+0

팁 주셔서 감사하지만 문제를 해결하지 못했습니다. @Stephen은 올바른 경로에 있었지만 왜 ClassNotFoundException을 얻는 지 알 수 없습니다 ... – araisbec

관련 문제