有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在为我的大学做一个实验室,我应该使用UDP通过客户端使用socket将一些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);
}

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

附言。 请不要告诉我使用RMI或任何其他方法来做这件事,我只需要使用UDP来做这件事。 多谢各位


共 (2) 个答案

  1. # 1 楼答案

    UDP是基于消息的,不像TCP那样基于流。UDP不保证交付。它不能保证接收方按照发送的相同顺序获取消息(数据报)。你应该把你的数据分成块,并对它们进行适当的排序,这样接收者就可以把这些块重新组合成任何正在发送的内容。这个练习可能是TCP如何处理所有这些细节的一个引导:)

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

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

    我不在Java中工作,所以我会让您参考examples了解API的用法

  2. # 2 楼答案

    服务器端的模式类似于:

        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不负责这一点! 这意味着您需要实现自己的一致性协议。 发送端永远无法确定数据是否也在另一端收到。 对于像ArrayList这样的数据传输,我宁愿使用TCP套接字通信。 还请注意,数据包的大小是有限的。有关详细信息,请参阅DatagramPacket#setSendBufferSize(int size)