首页 文章

Java将Java对象作为数据报包接收

提问于
浏览
0

我想将一个对象作为UDP数据包发送,然后在服务器上接收该对象 . 我有客户端想出来,但我不能让服务器正确读取数据报 .

客户代码:

public void sendMessage() {
        ByteArrayOutputStream bStream = new ByteArrayOutputStream();

        try {
            ObjectOutput oo = new ObjectOutputStream(bStream);
            oo.writeObject(asset);
            // Send it

            byte[] serializedMessage = bStream.toByteArray();

            DatagramPacket sendPacket = new DatagramPacket(serializedMessage,
                    serializedMessage.length, ipAddress, sPort);
            clientSocket.send(sendPacket);
            oo.close();

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

服务器失败尝试 .

public void startServer() {
    try {
         serverSocket = new DatagramSocket(this.serverPort);
         serverSocket.receive(new DatagramPacket()); /*Code fails here, I realise
         * the constructor does not have input, but I can not figure out how to init
         *a buffer whose size I do not know beforehand.
         */
       this.threadPool.execute(new QueryTask(packet));
    } catch (IOException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
        }
}

我使用了以下问题Sending Objects Across Network using UDP in Java来发送对象,但它没有显示他是如何收到所述对象的 .

问题2:收到并解析数据包后创建新线程是否更好?还是应该通过Datagrampacket创建带有DatagramSocket的新线程?

提前致谢 .

2 回答

  • 2

    创建一个比您希望接收的最大数据包大的缓冲区 . 然后,如果你得到一个大小的数据包,那就是溢出 . 请注意,您应该在每次接收之前重新初始化DatagramPacket的长度,否则它会缩小到目前为止收到的最小数据报 .

    如果你可以足够快地处理数据包,你根本不需要使用UDP的线程,没有连接可以处理 .

  • 1

    正如您所见,datagramm数据包需要缓冲区来写入内容 . 我会创建缓冲区,这对于志愿数据来说足够大(UDP指定IPK4为65K,IPV6为4G) . 如果我是你,我不会使用java.io序列化,因为它会在每个类更改(甚至有时编译器更改)中断 . 使用更强大的序列化方法,如JSON(使用jackson / gson)或XML或protobuf

相关问题