java - 序列化和反序列化 - 套接字编程

标签 java sockets serialization client-server

我正在开发一个客户端服务器java应用程序,使用序列化和反序列化。起初,我只是想将序列化的数据包发送到服务器,服务器将其反序列化并将其打印在屏幕上。

这是我的客户端:

public class Client {

    public static void main(String[] args) throws IOException {

        int portUDP = Integer.parseInt("6004");
        InetAddress host = InetAddress.getByName("127.0.0.1");

        DatagramSocket UDPsock = new DatagramSocket();

        ByteArrayOutputStream oSt = new ByteArrayOutputStream();
        ObjectOutputStream ooSt = new ObjectOutputStream(oSt);

        packet pck = new packet(2,1,3,"try");

        ooSt.writeObject(pck);
        ooSt.flush();

        byte[] sendBuf = new byte[30];
        sendBuf = oSt.toByteArray();

        DatagramPacket payload = new DatagramPacket(sendBuf, sendBuf.length, host, portUDP);
        UDPsock.send(payload);


        UDPsock.close();
    }

}

这是我的服务器:

public class Server {

    public static void main(String[] args) throws IOException, ClassNotFoundException {

        int portUDP = 6004;

        DatagramSocket UDPsock = new DatagramSocket(portUDP);

        byte[] payload = new byte[30];
        DatagramPacket inUDP = new DatagramPacket(payload, payload.length);

        UDPsock.receive(inUDP);

        ByteArrayInputStream oSt = new ByteArrayInputStream(inUDP.getData());
        ObjectInputStream ooSt = new ObjectInputStream(oSt);

        packet pck = (packet)ooSt.readObject();

        pck.printContents();

        UDPsock.close();
    }

}

我认为我的问题在于反序列化,但我无法发现它。请帮助我

这是我的错误:

Exception in thread "main" java.io.EOFException
    at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2353)
    at java.io.ObjectInputStream$BlockDataInputStream.readUTFBody(ObjectInputStream.java:3092)
    at java.io.ObjectInputStream$BlockDataInputStream.readUTF(ObjectInputStream.java:2892)
    at java.io.ObjectInputStream.readUTF(ObjectInputStream.java:1075)
    at java.io.ObjectStreamClass.readNonProxy(ObjectStreamClass.java:717)
    at java.io.ObjectInputStream.readClassDescriptor(ObjectInputStream.java:833)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1609)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1521)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1781)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373)
    at Server.main(Server.java:23)

最佳答案

byte[] payload = new byte[30];

问题就出在这里。序列化流比这大得多。尝试 576。

还要注意传出字节数组的大小。如果超过 576,您将遇到 IP 碎片,这将开始导致数据报丢失,并且您最终将遇到通常只有 1250-1500 字节的路径 MTU。所以你不能序列化大对象。

另外:

ByteArrayInputStream oSt = new ByteArrayInputStream(inUDP.getData());

应该是:

ByteArrayInputStream oSt = new ByteArrayInputStream(inUDP.getData(), inUDP.getOffset(), inUDP.getLength());

关于java - 序列化和反序列化 - 套接字编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46554132/

相关文章:

node.js - 如何在 node.js http 模块超时时发送响应

ios - 基本客户端/服务器示例代码适用于 iOS 模拟器,但不适用于设备

json - 如何使用 Jackson 将 Scala 值类序列化为字符串?

java - 使用较新的类从磁盘读取序列化的 java 对象?

java - 序列化二叉搜索树

javascript - 从 json 代码中删除 javascript 对象变量名称文本

java - 在运行时获取类的泛型类型

java - 如何通过读取文件来获取以空格分隔的字符串流?

java - 获取字符串的哈希值作为字符串

c++ - 使套接字服务器接受多个客户端