【问题标题】:Why does Java DatagramSocket return false on "isConnected" when it is definitely connected?为什么 Java DatagramSocket 在“isConnected”上返回 false 时它肯定是连接的?
【发布时间】:2016-02-18 01:54:20
【问题描述】:

我正在学习简单的 UDP 教程 HERE,但我遇到了问题。

//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。作为一个仅供参考,我也使用了 getPort() 方法,它总是返回“-1”,也表明它没有连接,即使它是。

如果套接字在关闭之前已连接,则此方法将在套接字关闭后继续返回连接的端口号。

发生了什么事?

编辑:我发布了我链接到的页面的完整代码。

【问题讨论】:

  • 嗯,你在那个套接字上调用了 connect() 吗?
  • 我在您的代码中看到两个 DatagramSocket,dsdatagramSocket!我怀疑你有什么不同的事情发生。另外,发布相关代码,或者更好地使用您正在试验的代码,这不足以回答问题。
  • @Am_I_Helpful 只有一个套接字,我纠正了我的数据输入错误。另外,我发布了一个指向我正在使用的确切代码的链接。
  • UDP 是无连接协议,Java 对“已连接”的解释超级怪:stackoverflow.com/a/6362448/995891
  • @Am_I_Helpful 已发布完整代码。

标签: java sockets network-programming port datagram


【解决方案1】:

要使 isConnected() 的输出为 true,您需要首先使用方法 public void connect(InetAddress host, int port) 将 DatagramSocket 连接到特定的 InetAddress 和端口号。

如果您没有将它连接到特定的 InetAddress 和端口,isConnected() 的结果将为 false。您可以在您的代码上进行测试。

来自Managing Connections topic in Chapter 12. UDP, of Java Network Programming Fourth Edition:-

connect() 方法并没有真正在 TCP 中建立连接 感觉。但是,它确实指定 DatagramSocket 将只发送 数据包发送到和接收来自指定远程主机的数据包 指定的远程端口。尝试将数据包发送到不同的主机或 端口会抛出一个IllegalArgumentException。收到的数据包 不同的主机或不同的端口将被丢弃而没有 异常或其他通知。

在调用 connect() 方法时会进行安全检查。如果 允许虚拟机向该主机和端口发送数据,检查通过 默默。如果不是,则抛出 SecurityException。然而,一旦 已建立连接,该 DatagramSocket 上的 send() 和 receive() 不再进行他们通常进行的安全检查。

同样,关于

public int getPort()

当且仅当 DatagramSocket 连接时,getPort() 方法 返回它所连接的远程端口。否则,它 返回 –1。

关于

public void disconnect()

disconnect() 方法断开已连接的“连接” DatagramSocket 以便它可以再次发送数据包和接收 来自任何主机和端口的数据包。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多