【问题标题】:Serialization and Deserialization - Socket Programming序列化和反序列化 - 套接字编程
【发布时间】:2017-10-03 22:05:06
【问题描述】:

我正在使用序列化和反序列化处理客户端服务器 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)

【问题讨论】:

  • 我用我的错误更新了它

标签: java sockets serialization client-server


【解决方案1】:
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());

【讨论】:

    猜你喜欢
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多