为什么Java DatagramSocket在“isConnected”肯定连接时返回false?

时间:2015-11-16 20:49:10

标签: java sockets network-programming port datagram

我正在关注简单的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。作为一个FYI,我也使用了getPort()方法,它总是返回“-1”,也表示它没有连接,即使它是。

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

发生了什么事?

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

1 个答案:

答案 0 :(得分:4)

要使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只发送   数据包从指定的远程主机上接收和接收数据包   指定的远程端口。尝试将数据包发送到其他主机或   port将抛出IllegalArgumentException。收到的数据包   不同的主机或不同的端口将被丢弃   例外或其他通知。

     

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

同样,关于

public int getPort()
  

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

和关于

public void disconnect()
  

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