簡體   English   中英

如何通過 UDP 服務器/客戶端發送數組列表

[英]How to send array list through a UDP server/client

我正在為我的大學建立一個實驗室,我應該使用 UDP 將一些 arrayList 通過客戶端傳輸到使用 sockets 的服務器。 我有很多搜索,但我仍然無法讓它工作。

直到現在我在客戶端

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 來執行此操作。 謝謝

UDP 是基於消息的,而不是像 TCP 那樣基於流的。 UDP 不保證交貨。 它不保證接收者按照它們發送的相同順序獲取消息(數據報)。 您應該將數據划分為塊並正確排序它們,以便接收者可以將這些塊重新組合成正在發送的任何內容。 該練習可能是 TCP 如何處理所有這些細節的前奏:)

Maximum size of UDP datagram is 64K, though all practical applications try to limit packet size to at most the MTU (1500 for Ethernet minus 20 bytes of IPv4 header minus 8 bytes of UDP header = 1472)

也就是說,您可能希望在每個數據報中添加一點 header 以指示數據有效負載的大小及其在應用程序“流”中的順序。

我不在 Java 工作,所以我將向您推薦 API 用法的示例

服務器端的模式類似於:

    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)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM