[英]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.