当前位置: 技术问答>java相关
用DatagramSocket通信的问题?
来源: 互联网 发布时间:2015-11-04
本文导语: 我用DatagramSocket编写数据报socket通信,遇到一个很奇怪的问题,请大家帮帮忙. 我是创建了一个线程,其run方法如下: public void run() { try { sock = new DatagramSocket(RECVPORT); ...
我用DatagramSocket编写数据报socket通信,遇到一个很奇怪的问题,请大家帮帮忙.
我是创建了一个线程,其run方法如下:
public void run() {
try {
sock = new DatagramSocket(RECVPORT);
System.out.println("UDP communication start:"+RECVPORT);
while (true) {
sock.receive(packet);
...
}
} catch (SocketException e) {
System.err.println("can't open socket");
return;
} catch (IOException e) {
System.err.println("communication error");
e.printStackTrace();
return;
}
}
另外有一个发送方法send:
public void send(byte[] buf) {
DatagramPacket packet = new DatagramPacket(buf, buf.length, addr, port);
try {
sock.send(packet);
} catch (IOException e) {
System.err.println("communication error");
e.printStackTrace();
return;
}
}
当对方程序在运行时,我的程序运行一切正常,但是若对方程序未启动,当我调用send发送数据时,程序会打印出can't open socket,即在run方法中的sock.receive抛出了异常,此后即使再启动对方程序,调用send发送数据时对方都收不到数据,但是send也没有抛出异常.
我实在搞不明白,数据报不是面向无接连的吗,怎么还跟通信对方有关,请高手赐教?
我是创建了一个线程,其run方法如下:
public void run() {
try {
sock = new DatagramSocket(RECVPORT);
System.out.println("UDP communication start:"+RECVPORT);
while (true) {
sock.receive(packet);
...
}
} catch (SocketException e) {
System.err.println("can't open socket");
return;
} catch (IOException e) {
System.err.println("communication error");
e.printStackTrace();
return;
}
}
另外有一个发送方法send:
public void send(byte[] buf) {
DatagramPacket packet = new DatagramPacket(buf, buf.length, addr, port);
try {
sock.send(packet);
} catch (IOException e) {
System.err.println("communication error");
e.printStackTrace();
return;
}
}
当对方程序在运行时,我的程序运行一切正常,但是若对方程序未启动,当我调用send发送数据时,程序会打印出can't open socket,即在run方法中的sock.receive抛出了异常,此后即使再启动对方程序,调用send发送数据时对方都收不到数据,但是send也没有抛出异常.
我实在搞不明白,数据报不是面向无接连的吗,怎么还跟通信对方有关,请高手赐教?
|
我说的参考资料你有没有看?
对方机器没有程序在端口上接收的话,对方机器会返回一个“目标不可到达”的ICMP包,本地主机接收到该包后一般会把它丢弃,只有两种情况例外,一:你的UDP SOCKET是已经“connect”到对方机器的端口上的;二:本地主机操作系统是win2000,它会把该ICMP包发送给应用程序,导致JAVA的receive方法抛出一个“socket已关闭”的例外;所以在win2000上肯定会存在你提到的问题,同样的程序在NT和UNIX上都正常。这是我在以前一个项目中测了好多台机器(包括3台win2000,3台NT,1台HP UNIX, 1台SOLARIS)得出的结论。
对方机器没有程序在端口上接收的话,对方机器会返回一个“目标不可到达”的ICMP包,本地主机接收到该包后一般会把它丢弃,只有两种情况例外,一:你的UDP SOCKET是已经“connect”到对方机器的端口上的;二:本地主机操作系统是win2000,它会把该ICMP包发送给应用程序,导致JAVA的receive方法抛出一个“socket已关闭”的例外;所以在win2000上肯定会存在你提到的问题,同样的程序在NT和UNIX上都正常。这是我在以前一个项目中测了好多台机器(包括3台win2000,3台NT,1台HP UNIX, 1台SOLARIS)得出的结论。
|
DatagramPacket packet = new DatagramPacket(buf, buf.length, addr, port);这句中的addr,和port是指定open的地址,端口的!如果没有当然会出错!
|
我在1.4/1.3.1+Win2000下试验,用同一个socket没有这个错误,恐怕还有别的原因吧,你的版本是多少?
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。