【发布时间】: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,
ds和datagramSocket!我怀疑你有什么不同的事情发生。另外,发布相关代码,或者更好地使用您正在试验的代码,这不足以回答问题。 -
@Am_I_Helpful 只有一个套接字,我纠正了我的数据输入错误。另外,我发布了一个指向我正在使用的确切代码的链接。
-
UDP 是无连接协议,Java 对“已连接”的解释超级怪:stackoverflow.com/a/6362448/995891
-
@Am_I_Helpful 已发布完整代码。
标签: java sockets network-programming port datagram