簡體   English   中英

UDP套接字數據報接收數據包2x以獲取完整消息

[英]UDP socket Datagram receive packet 2x to get full message

我正在用Java構建一個實驗性游戲服務器。

客戶發送:

length: 22\r\n
playerId: 0\r\n
\r\n\r\n
this is a test message

用於接收消息的Java代碼:

String message = "";

byte[] buf = new byte[20];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socketServer.receive(packet);
message += new String(buf, "UTF8");

buf = new byte[20];
packet = new DatagramPacket(buf, buf.length);
socketServer.receive(packet);
message += new String(buf, "UTF8");

這不接收客戶端發送的40個字節的消息,它接收20個字節,而第二個socketServer.receive(packet)則掛起新消息。

def的理由:

此方法將阻塞,直到收到數據報。 數據報包對象的長度字段包含接收消息的長度。 如果消息長於數據包的長度,則消息將被截斷。

我需要能夠讀取20個字節的消息和另外20個字節的消息。 怎么能實現這一目標?

我需要這個,因為我不確定消息會持續多久。 我想要這樣的東西:

String message = "";
while (!message.contains("\r\n\r\n")) { //"\r\n\r\n" marks end of message
    byte[] buf = new byte[20];
    DatagramPacket packet = new DatagramPacket(buf, buf.length);
    socketServer.receive(packet);
    message += new String(buf, "UTF8");
}

假設消息以\\r\\n\\r\\n結尾,則獲取完整消息。

它需要通過UDP協議完成。 我是Java套接字的新手,但我認為有一些東西,只是找不到它。 提前致謝。

如果寫入40個字節,則應該接收40個字節。 如果你寫40個字節而你的緩沖區只有20個,那么你將丟失20個字節。

問:那么為什么不讓你的緩沖區為256字節(例如),並讀取你得到的任何東西?

問:如果您需要“消息”分兩部分...那么為什么不發送兩條消息?

UDP不是為可變長度讀取而設計的 - 每個read() [或recv() ]將對應於服務器上的單個write() [或send() ]。

如果只讀取40字節數據包的20個字節,則將丟棄剩余的字節。

您需要創建一個足夠大的緩沖區來接收整個數據包(如果您的網絡正確處理碎片,則最多65536個字節)然后一次讀取整個數據包。

該API會告訴你有多少字節實際上收到的-你應該考慮檢查,對在包的編碼值,以確保您確實收到整個數據包。

暫無
暫無

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

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