有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java序列化和反序列化socket编程

我正在使用序列化和反序列化开发一个客户机-服务器java应用程序。首先,我只想向服务器发送一个序列化的数据包,服务器将其反序列化并在屏幕上打印出来

以下是mi客户端:

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)

共 (1) 个答案

  1. # 1 楼答案

    byte[] payload = new byte[30];
    

    问题就在这里。序列化流远不止这些。试试576

    还要注意输出字节数组的大小。如果超过576,您将遇到IP碎片,这将开始导致数据报丢失,最终会遇到路径MTU,通常只有1250-1500字节。因此无法序列化大型对象

    此外:

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

    应该是:

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