序列化对象在通过UDP发送到java中的客户端后具有空值

时间:2011-10-19 15:27:56

标签: java serialization client udp

这个问题让我陷入困境。这是我正在进行的非常简单的在线多人游戏。

我目前能够通过udp将数据包发送到我的客户端,他们似乎很好。但是,当我将一个序列化对象发送到我的客户端并在另一端反序列化时,当我尝试访问我需要的值时,我得到NullPointerExceptions。我已经验证对象在服务器端正确序列化(反序列化并检查数据),所以我99%确定我在发送数据包的代码时做了一些非常错误。

以下是从服务器序列化和发送“Datagram”对象的代码:

    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) {}

被序列化的“数据”对象充满了正确的值;我很确定。

另一个相关的代码块是客户端的接收块:

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;

}

当我在反序列化后尝试读取任何值时,我得到NullPointerException。如果有人能指出我正确的方向,我将非常高兴。

哦,我现在正故意向当地主人发送信息。我的客户端和服务器都在我的机器上运行。

2 个答案:

答案 0 :(得分:2)

在发送和接收端,您正在捕捉和压缩异常。很有可能这隐藏了可以帮助您诊断问题的证据。即使不是这种情况,压缩像这样的例外也是危险的做法。

我敢打赌,接收端代码中会抛出ClassNotFoundException。这将使您data == null,然后在随后的循环中导致NPE。

答案 1 :(得分:2)

您的代码可能存在的一个问题是,在关闭toByteArray()之前请致电ObjectOutputStream

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

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

如果序列化数据的某些部分在close()之前未写入输出流,则在这种情况下它们将丢失。关闭流后尝试调用toByteArray()