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 创建一个新线程?

提前致谢。

4

2 回答 2

2

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

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

于 2012-10-18T07:27:33.643 回答
1

正如您已经看到的,数据报数据包需要缓冲区来写入内容。我会创建一个足够大的缓冲区来存储意图数据(UDP 为 IPV4 指定 65K,为 IPV6 指定 4G)。如果我是你,我不会使用 java.io 序列化,因为它会在每次类更改(甚至有时编译器更改)时中断。使用更健壮的序列化方式,如 JSON(使用 jackson / gson)或 XML 或 protobuf

于 2012-10-18T07:24:49.887 回答