![](/img/trans.png)
[英]Why does java.net.DatagramSocket support a “connected” state?
[英]Why does Java DatagramSocket return false on “isConnected” when it is definitely connected?
我在這里遵循簡單的UDP教程,但是遇到了問題。
//DSender.java
import java.net.*;
public class DSender{
public static void main(String[] args) throws Exception {
try{
DatagramSocket ds = new DatagramSocket();
String str = "Welcome java";
InetAddress ip = InetAddress.getByName("127.0.0.1");
DatagramPacket dp = new DatagramPacket(str.getBytes(), str.length(), ip, 3000);
ds.send(dp);
System.out.println(ds.isConnected());
} catch(Exception e){
} finally {
ds.close();
}
}
}
//DReceiver.java
import java.net.*;
public class DReceiver{
public static void main(String[] args) throws Exception {
try{
DatagramSocket ds = new DatagramSocket(3000);
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, 1024);
ds.receive(dp);
String str = new String(dp.getData(), 0, dp.getLength());
System.out.println(str);
} catch(Exception e){
} finally {
ds.close();
}
}
}
在關閉插槽之前,請執行以下操作:
ds.send(dp);
System.out.println(ds.isConnected());
ds.close();
在連接上,即使它確實已連接,並且總是成功地將消息從客戶端發送到服務器,但它總是返回false。 閱讀Java 7 API時,它表示:
如果套接字在關閉之前已連接,則此方法在套接字關閉后將繼續返回true。
由於我在關閉之前調用了isConnected()方法,因此它應顯示為true。 作為一個FYI,我還使用了getPort()方法,它始終返回“ -1”,這也表明它沒有連接,即使已經連接。
如果套接字在關閉之前已連接,則此方法將在套接字關閉后繼續返回連接的端口號。
到底是怎么回事?
編輯:我張貼了我鏈接到的頁面的完整代碼。
要使isConnected()的輸出為true,您需要使用public void connect(InetAddress host, int port)
方法將DatagramSocket首先連接到特定的InetAddress和端口號。
如果未將其連接到特定的InetAddress和端口,則isConnected()的結果將為false。 您可以對代碼進行測試。
摘自Java網絡編程第四版第12章UDP中的“管理連接”主題 :
connect()方法實際上並沒有在TCP方面建立連接。 但是,它確實指定了DatagramSocket將僅在指定的遠程端口上向指定的遠程主機發送數據包和從其接收數據包。 嘗試將數據包發送到其他主機或端口將拋出
IllegalArgumentException
。 從其他主機或其他端口收到的數據包將被丟棄,而不會出現異常或其他通知。調用connect()方法時,將進行安全檢查。 如果允許VM將數據發送到該主機和端口,則檢查將以靜默方式通過。 如果不是,則拋出
SecurityException
。 但是,一旦建立連接,該DatagramSocket上的send()和receive()就不再進行通常要進行的安全檢查。
同樣,關於
public int getPort()
當且僅當連接了DatagramSocket時,getPort()方法才會返回其連接到的遠程端口。 否則,它返回–1。
和關於
public void disconnect()
Disconnect()方法斷開連接的DatagramSocket的“連接”,以便它可以再次向任何主機和端口發送數據包並從任何主機和端口接收數據包。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.