Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
序列化对象在通过UDP发送到java中的客户端后具有空值_Java_Serialization_Client_Udp - Fatal编程技术网

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

序列化对象在通过UDP发送到java中的客户端后具有空值,java,serialization,client,udp,Java,Serialization,Client,Udp,这个问题快把我逼疯了。这是一个非常简单的在线多人游戏,我目前正在工作 我目前能够通过udp向我的客户机发送数据包,而他们似乎可以很好地接收数据包。但是,当我将序列化对象发送到客户端并在另一端反序列化时,当我尝试访问所需的值时,会收到NullPointerException。我已经验证了该对象在服务器端被正确序列化(反序列化并检查数据),因此我99%确定我发送数据包的代码有错误 以下是用于序列化和从服务器发送“数据报”对象的代码: DatagramPacket sendPacket = n

这个问题快把我逼疯了。这是一个非常简单的在线多人游戏,我目前正在工作

我目前能够通过udp向我的客户机发送数据包,而他们似乎可以很好地接收数据包。但是,当我将序列化对象发送到客户端并在另一端反序列化时,当我尝试访问所需的值时,会收到NullPointerException。我已经验证了该对象在服务器端被正确序列化(反序列化并检查数据),因此我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) {}
被序列化的“数据”对象充满了正确的值;这一点我是肯定的

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

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;

}
公共数据报readDatagram(){
字节[]buff=新字节[20000];
DatagramPacket数据包=新的DatagramPacket(buff,buff.length);
DatagramSocket接收器=空;
试一试{
接收器=新的DatagramSocket(4004);
接收(数据包);
}捕获(IOE异常){
系统输出打印项次(“错误2”);
}
数据报数据=null;/=新数据报();
试一试{
//从字节数组反序列化
ByteArrayInputStream bis=新的ByteArrayInputStream(buff);
ObjectInput in=新ObjectInputStream(bis);
data=.readObject()中的(数据报);
二、关闭();
in.close();
}catch(classnotfounde异常){
}捕获(IOE异常){
系统输出打印项次(“错误3”);
}
对于(int i=0;i<35;i++){
System.out.print(data.getLevel()[i]);
}
receiver.close();
返回数据;
}
当我尝试在反序列化之后读取任何值时,会得到NullPointerException。如果有人能给我指出正确的方向,我会非常高兴


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

在发送端和接收端,您都在捕获和压缩异常。这很有可能隐藏了有助于诊断问题的证据。即使情况并非如此,挤压这样的例外也是危险的做法


我打赌在接收端代码中会抛出一个
ClassNotFoundException
。这将给您留下
data==null
,这将导致以下循环中出现NPE。

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

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

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

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

谢谢提醒。在例外情况中添加了独特的打印输出,但是我仍然没有接近解决这个问题。您的赌注是正确的。从现在起,我会采纳你的建议,妥善处理我的异常情况。现在,为什么你认为我会得到那个例外?数据报是我创建的一个类,源文件在我的源目录中(我在Netbeans中)。。。我甚至可以创建它的对象。你就是那个人。我研究了这个问题,实际上通过阅读你的另一篇帖子发现了这个问题。我在服务器端创建对象时使用了数据报类的附加副本,但使用了不同的包名。我不知道有那么敏感,是的。完全限定的类名必须匹配。理想情况下,您应该在客户端和服务器端使用相同的JAR文件。感谢您的提示,但这并没有解决问题@Stephen在正确的轨道上,但是我不明白为什么我会得到ClassNotFoundException。。。