浏览 3252 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (10)
|
|
---|---|
作者 | 正文 |
发表时间:2012-11-30
关于Java的MulticastSocket 同时Receive与Send相互不阻塞
直接上代码:
package org.eyet.net.udp.multicast.test; import java.io.IOException; import java.net.DatagramPacket; import java.net.InetAddress; import java.net.MulticastSocket; import org.junit.Test; public class MulticastTest { private MulticastSocket multicastSocket; private InetAddress group; public static void main(String[] args) throws IOException{ new MulticastTest().testSingleMulticastRecvAndSend(); } @Test public void testSingleMulticastRecvAndSend() throws IOException { group = InetAddress.getByName("228.5.6.7"); multicastSocket = new MulticastSocket(6789); multicastSocket.joinGroup(group);// 加入该组 new Thread(new Runnable() { public void run() { byte[] arb = new byte[1024]; System.out.println("run receive"); while (true) { DatagramPacket datagramPacket = new DatagramPacket(arb, arb.length); try { multicastSocket.receive(datagramPacket); Thread.sleep(1000); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(arb.length); System.out.println(new String(arb)); } } }).start(); new Thread(new Runnable() { public void run() { int i=0; try { Thread.sleep(1100); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } System.out.println("run send"); while(true && i<10){ String sendMessage = "hello world"+i++; DatagramPacket datagramPacket = new DatagramPacket( sendMessage.getBytes(), sendMessage.length(), group, 6789); try { multicastSocket.send(datagramPacket); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println("send over"); } }).start(); } }
输出结果:
run receive run send send over 1024 hello world0 ……
可以看到receive先运行,但还能使用send方法进行发送
所以我判断receive与send能同时运行
请各位多多指教。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-11-30
不知道你在说什么,
receive/send 谁说不能同时run的 注意receive方法是说receive method blocks until a datagram is received. 举个例子,如果你打开网络播放器(相当于receive),如果按你说的,不能和send同时运行,那么优酷server岂不是卡死了(因为send不出去啊) 看看UDP就不难理解了。阻塞是说阻塞receive线程 |
|
返回顶楼 | |
发表时间:2012-11-30
cectsky 写道 不知道你在说什么,
receive/send 谁说不能同时run的 注意receive方法是说receive method blocks until a datagram is received. 举个例子,如果你打开网络播放器(相当于receive),如果按你说的,不能和send同时运行,那么优酷server岂不是卡死了(因为send不出去啊) 看看UDP就不难理解了。阻塞是说阻塞receive线程 请注意,这里只是使用了一个Socket对象MulticastSocket,我的结论是建立在只建立了一个Socket对象的情况下,使用同一个Socket对象可以同时接与同时收。 |
|
返回顶楼 | |