我正在关注简单的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”,也表示它没有连接,即使它是。
如果套接字在关闭之前已连接,则此方法将在套接字关闭后继续返回连接的端口号。
发生了什么事?
编辑:我发布了我链接到的页面中的完整代码。
答案 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使它可以再次发送和接收数据包 来自任何主机和端口的数据包。