MulticastSocket的receive方法一直报错 就算按照JDK上面的列子还是报错,懂的人进来指导下 谢谢

panmagic 2009-05-02 10:54:32
JDK 1.6的例子如下:
String msg = "Hello";
InetAddress group = InetAddress.getByName("228.5.6.7");
MulticastSocket s = new MulticastSocket(6789);
s.joinGroup(group);
DatagramPacket hi = new DatagramPacket(msg.getBytes(), msg.length(),
group, 6789);
s.send(hi);
// get their responses!
byte[] buf = new byte[1000];
DatagramPacket recv = new DatagramPacket(buf, buf.length);
s.receive(recv);
...
// OK, I'm done talking - leave the group...
s.leaveGroup(group);

我的代码如下:
public static void main(String[] args) throws Exception{
String msg = "Hello";
InetAddress group = InetAddress.getByName("228.5.6.7");
MulticastSocket s = new MulticastSocket(6789);
s.setSoTimeout(10000);
s.joinGroup(group);
DatagramPacket hi = new DatagramPacket(msg.getBytes(), msg.length(),
group, 6789);
s.send(hi);
// get their responses!
byte[] buf = new byte[1000];
DatagramPacket recv = new DatagramPacket(buf, buf.length);
s.receive(recv);
String message = String.valueOf(recv);
System.out.println(message);
// OK, I'm done talking - leave the group...
System.out.println("111111111");
s.leaveGroup(group);

}

结果一直抛
Exception in thread "main" java.net.SocketTimeoutException: Receive timed out
at java.net.PlainDatagramSocketImpl.receive0(Native Method)
at java.net.PlainDatagramSocketImpl.receive(PlainDatagramSocketImpl.java:136)
at java.net.DatagramSocket.receive(DatagramSocket.java:712)
at testFrame.main(testFrame.java:19) 这种异常 不知道为什么 还望不惜赐教
...全文
413 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
DarknessLighting 2009-05-05
  • 打赏
  • 举报
回复
怀疑是程序执行接收包的动作慢半拍的关系。楼主可以先开始接收,再发送数据包。如:

public static void main(String [] args) throws Exception {
String msg = "Hello";
InetAddress group = InetAddress.getByName( "228.5.6.7" );
final MulticastSocket s = new MulticastSocket( 6789 );
s.setSoTimeout( 10000 );
s.joinGroup( group );
final DatagramPacket hi = new DatagramPacket( msg.getBytes(), msg.length(), group, 6789 );
new Thread(){
public void run(){
try {
Thread.sleep( 2000 );
s.send( hi );
}
catch (Exception e) {
e.printStackTrace();
}
}
}.start();
// get their responses!
byte [] buf = new byte [ 1000 ];
DatagramPacket recv = new DatagramPacket( buf, buf.length );
s.receive( recv );
String message = new String( recv.getData(), 0, recv.getLength() );
System.out.println( message );
// OK, I'm done talking - leave the group...
System.out.println( "111111111" );
s.leaveGroup( group );
}
jinxfei 2009-05-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dang_chao_fan 的回复:]
你调用s.setSoTimeout(10000);
如果先前调用了 setSoTimeout 且超时值已过,就会抛出SocketTimeoutException
你可以将时间设置大一点试试
[/Quote]

楼上说的道理正确,但处理这个问题,并不是简单设大SoTimeout。
要看楼主的需求,如果你只是想阻塞读,通常SoTimeout应该设置为0(也就是不生效,阻塞模式),
如果你想用非阻塞的模式,则通常设置SoTimeout>0,这样抛出timeout异常是正常情况,
所以你需要自己捕获这个异常,并用一个while循环来不停的尝试从socket上收取数据。
jinxfei 2009-05-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 panmagic 的回复:]
To:楼上的2位
我分别把时间设置久了一点,和设置0

出来的结果是:设置久一点 依然会抛出:
Exception in thread "main" java.net.SocketTimeoutException: Receive timed out
at java.net.PlainDatagramSocketImpl.receive0(Native Method)
at java.net.PlainDatagramSocketImpl.receive(PlainDatagramSocketImpl.java:136)
at java.net.DatagramSocket.receive(DatagramSocket.java:712)
at testFrame.main(tes…
[/Quote]


该怎么做取决于你的需求,

我已经说过了,只要你设置了SoTimeout,抛出异常就是正常的,你要自己处理此异常。
而阻塞读,是只有收到广播包才会返回。
panmagic 2009-05-03
  • 打赏
  • 举报
回复
To:楼上的2位
我分别把时间设置久了一点,和设置0

出来的结果是:设置久一点 依然会抛出:
Exception in thread "main" java.net.SocketTimeoutException: Receive timed out
at java.net.PlainDatagramSocketImpl.receive0(Native Method)
at java.net.PlainDatagramSocketImpl.receive(PlainDatagramSocketImpl.java:136)
at java.net.DatagramSocket.receive(DatagramSocket.java:712)
at testFrame.main(testFrame.java:19)

而设置成0 程序就在那不停地读,也不往下走。

问题还是没能解决~~~
starscc 2009-05-02
  • 打赏
  • 举报
回复
你调用s.setSoTimeout(10000);
如果先前调用了 setSoTimeout 且超时值已过,就会抛出SocketTimeoutException
你可以将时间设置大一点试试

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧