如何通过UDP服务器/客户端发送阵列列表

时间:2011-07-18 15:17:15

标签: java sockets object network-programming udp

我正在为我的大学开设实验室,我应该使用UDP通过客户端将一些arrayList通过客户端传输到服务器。 我搜索了这么多,但我仍然设法让它工作。

直到现在我在客户端

ArrayList <Integer> arr = new ArrayList<Integer>();
ByteArrayOutputStream bStream = new ByteArrayOutputStream();
ObjectOutput oo = new ObjectOutputStream(bStream); 
//here i add some code to fill the array..
oo.writeObject(arr);
byte [] buf=bStream.toByteArray();
upd.sendPacket(buf, clientSocket); //this is a method for sending packets

在服务器端我得到了

            ByteArrayInputStream baos;
            ObjectInputStream oos;

$这是实现代码的地方

 else if (str.equals("max")) {
System.out.println("waitng for object to come");
upd.receivePacket(serverSocket, receiveData); //here i receive the datagram packet 
baos = new ByteArrayInputStream(receiveData);
oos = new ObjectInputStream(baos);
ArrayList<Integer> arr = (ArrayList<Integer>)oos.readObject();                                                  
    System.out.println(arr);
}

如果您能给我一些提示或者只是解释一下如何执行此操作的逻辑,我将非常感激。

PS。 请不要告诉我使用RMI或任何其他方法来执行此操作,我只需要使用UDP执行此操作。 谢谢

2 个答案:

答案 0 :(得分:1)

UDP是基于消息的,不像TCP那样基于流。 UDP不保证交付。它不保证接收者按照发送的顺序获取消息(数据报)。您应该将数据划分为块并对其进行正确排序,以便接收方可以将块重新组合回正在发送的内容中。这个练习可能是TCP处理所有这些细节的一个方法:)

UDP数据报的最大大小为64K,尽管所有实际应用程序都试图将数据包大小限制为最多MTU(以太网为1500减去IPv4标头的20字节减去UDP标头的8字节= 1472)

也就是说,您可能希望为每个数据报添加一个小标头,以指示数据有效负载的大小及其在应用程序“流”中的顺序。

我不使用Java,因此我会将您推荐给examples以获取API使用。

答案 1 :(得分:0)

服务器端的模式类似于:

    byte[] buf = new byte[1024];
    DatagramSocket s = new DatagramSocket(1234);
    DatagramPacket p = new DatagramPacket(buf, buf.length);
    s.receive(p);

并在客户端:

    DatagramSocket c = new DatagramSocket();
    InetSocketAddress addr = new InetSocketAddress("hostname",1234);
    DatagramPacket newPacket = new DatagramPacket(buf, 0, buf.length, addr);
    c.send(newPacket);

当然,您必须关心如何对数据进行编码并确保在接收端完成数据,因为UDP不会处理此问题! 这意味着您需要实现自己的一致性协议。 如果在另一端收到数据,则发送方永远无法确定。 为了传输像ArrayLists这样的数据,我宁愿使用TCP套接字通信。 另请注意,数据包大小有限。有关详细信息,请参阅DatagramPacket #setSendBufferSize(int size)。