繁体   English   中英

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

[英]Serialized object has null values after being sent via UDP to client in java

这个问题使我无所适从。 这是针对我目前正在开发的非常简单的在线多人游戏。

我目前能够通过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。 如果有人能指出正确的方向,我将非常高兴。

哦,我现在有意发送到localHost只是为了进行测试。 我的客户端和服务器都在我的计算机上运行。

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

我敢打赌,正在接收结束代码中引发ClassNotFoundException 这将使您的data == null ,然后将导致以下循环中的NPE。

您的代码可能存在的一个问题是您在关闭ObjectOutputStream之前调用toByteArray()

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM