序列化与反序列化——Socket编程

Serialization and Deserialization - Socket Programming

我正在开发客户端服务器 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());