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) 这种异常 不知道为什么 还望不惜赐教
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) 这种异常 不知道为什么 还望不惜赐教
如果先前调用了 setSoTimeout 且超时值已过,就会抛出SocketTimeoutException
你可以将时间设置大一点试试
楼上说的道理正确,但处理这个问题,并不是简单设大SoTimeout。
要看楼主的需求,如果你只是想阻塞读,通常SoTimeout应该设置为0(也就是不生效,阻塞模式),
如果你想用非阻塞的模式,则通常设置SoTimeout>0,这样抛出timeout异常是正常情况,
所以你需要自己捕获这个异常,并用一个while循环来不停的尝试从socket上收取数据。
我分别把时间设置久了一点,和设置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 程序就在那不停地读,也不往下走。问题还是没能解决~~~
而阻塞读,是只有收到广播包才会返回。
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 );
}