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) 这种异常 不知道为什么 还望不惜赐教

解决方案 »

  1.   

    你调用s.setSoTimeout(10000); 
    如果先前调用了 setSoTimeout 且超时值已过,就会抛出SocketTimeoutException
    你可以将时间设置大一点试试
      

  2.   


    楼上说的道理正确,但处理这个问题,并不是简单设大SoTimeout。
    要看楼主的需求,如果你只是想阻塞读,通常SoTimeout应该设置为0(也就是不生效,阻塞模式),
    如果你想用非阻塞的模式,则通常设置SoTimeout>0,这样抛出timeout异常是正常情况,
    所以你需要自己捕获这个异常,并用一个while循环来不停的尝试从socket上收取数据。
      

  3.   

    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 程序就在那不停地读,也不往下走。问题还是没能解决~~~
      

  4.   

    该怎么做取决于你的需求,我已经说过了,只要你设置了SoTimeout,抛出异常就是正常的,你要自己处理此异常。
    而阻塞读,是只有收到广播包才会返回。
      

  5.   

    怀疑是程序执行接收包的动作慢半拍的关系。楼主可以先开始接收,再发送数据包。如:    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 );
        }