我想将一个对象作为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 回答
创建一个比您希望接收的最大数据包大的缓冲区 . 然后,如果你得到一个大小的数据包,那就是溢出 . 请注意,您应该在每次接收之前重新初始化DatagramPacket的长度,否则它会缩小到目前为止收到的最小数据报 .
如果你可以足够快地处理数据包,你根本不需要使用UDP的线程,没有连接可以处理 .
正如您所见,datagramm数据包需要缓冲区来写入内容 . 我会创建缓冲区,这对于志愿数据来说足够大(UDP指定IPK4为65K,IPV6为4G) . 如果我是你,我不会使用java.io序列化,因为它会在每个类更改(甚至有时编译器更改)中断 . 使用更强大的序列化方法,如JSON(使用jackson / gson)或XML或protobuf