首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java DatagramSocket 接收封包:getLength() 返回資料長度而非端口號

     編輯:程式設計疑難解答

問題現象

客戶端綁定端口 3456,伺服器端用 `receivePacket.getLength()` 取得值卻是 24,改綁其他端口仍是 24,以為是端口號錯誤。

原因

`DatagramPacket.getLength()` 返回的是「實際接收到的資料長度(位元組數)」,而非發送端口號。 範例中發送了 24 位元組的資料,故返回 24。

正確取得發送端口

DatagramPacket receivePacket = new DatagramPacket(buf, buf.length);
socket.receive(receivePacket);

int senderPort = receivePacket.getPort();      // 發送方端口
InetAddress senderIP = receivePacket.getAddress(); // 發送方 IP
int dataLength = receivePacket.getLength();    // 資料長度
String data = new String(receivePacket.getData(), 0, dataLength);

關鍵 API 對照

方法含義
`getPort()`發送端口號
`getAddress()`發送 IP 位址
`getLength()`接收資料實際長度
`getData()`緩衝區引用(需配合 offset/length 解析)

補充

  • 客戶端綁定端口用 `socket = new DatagramSocket(3456)`,伺服器端 `receivePacket.getPort()` 即可得到 3456。
  • UDP 無連線,每次 `receive` 都能取得當次發送者的 IP:Port。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved