关于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能同时运行
请各位多多指教。
分享到:
相关推荐
* 减少网络阻塞:MulticastSocket 类可以减少网络阻塞,因为服务器程序只需要将数据发送到多点传送组,而不需要对每个客户端进行单独的传输。 五、结论 MulticastSocket 类是 Java 网络编程中的一种非常有用的类,...
在Java的网络编程中,`MulticastSocket`类是一个非常重要的工具,用于处理IP多播通信。IP多播是一种高效的数据传输方式,它允许一个发送者向多个接收者同时发送数据,而无需为每个接收者单独发送一次。这种方式在...
与单播(一对一)和广播(一对所有)不同,多播(一对多)可以在不重复发送数据的情况下将数据传递给多个接收者。IP多播地址范围为224.0.0.0到239.255.255.255。 使用Java的MulticastSocket,首先需要创建一个...
在Java中,还可以使用`java.net.NetworkInterface`类来获取网络接口信息,并通过`NetworkInterface`对象与`MulticastSocket`交互,实现更精细的组播组管理,如选择特定的网络接口发送或接收多播数据。 8. **多播...
本实例将深入探讨如何在Java中实现组播数据的发送与接收。 首先,我们需要导入Java的网络编程相关包,特别是`java.net.MulticastSocket`类,这是处理组播的关键: ```java import java.net.*; ``` 发送数据到组播...
在Java的网络编程中,`MulticastSocket`是一个非常重要的类,它允许程序接收和发送组播数据包。组播是一种通信方式,其中一条消息可以同时发送到多个目的地,而无需为每个接收者单独发送。这在需要向大量客户端广播...
"java-multicast-instance.rar"是一个关于Java实现组播功能的实例压缩包,包含了一个具体的编程示例,可以帮助开发者更好地理解和应用Java的组播技术。 在Java中,实现组播功能主要依赖于`java.net.MulticastSocket...
在Java中,我们可以使用`java.net.MulticastSocket`类来实现多播功能。这个类提供了加入和离开特定多播组、发送和接收多播数据包的能力。 1. **创建MulticastSocket** 首先,我们需要创建一个`MulticastSocket`...
4. **接收多播数据**:使用MulticastSocket的receive方法接收数据报包。这个方法是阻塞的,直到有数据可用。收到的数据报包包含发送者的IP地址和端口,以及接收到的数据。 5. **GUI设计**:为了实现可视化操作,...
调用`DatagramSocket.receive()`方法会阻塞,直到接收到一个数据报并将其填充到提供的`DatagramPacket`中。 4. **单向传输**: UDP是无连接的,所以它支持单向传输。如果只需要一方发送数据,另一方接收,只需在...
以下是一些关于Java UDP套接字网络编程的关键知识点: 1. **DatagramSocket创建与绑定**: - 创建DatagramSocket对象时,可以指定一个端口号。如果不指定,系统会随机分配一个。 - 使用`bind()`方法将...
Java提供了MulticastSocket类处理多播。 10. UDP安全性与优化: 虽然UDP的不可靠性可能带来数据丢失等问题,但可以通过应用层的机制(如序列号、确认机制等)来部分弥补。同时,注意防范UDP Flood攻击,适当限制...
### Java实现P2P通信的关键知识点 #### 一、P2P通信模型及关键技术分析 ##### (一)信息的传递 **1. P2P通信模型** P2P(Peer-to-Peer)通信模型是一种分布式网络架构,其中的每一个节点既是服务的提供者也是...
- 调用`MulticastSocket`的`receive(DatagramPacket packet)`方法,它会阻塞直到接收到一个数据包。 - 接收到的数据包包含RTP头信息,可以解析这些信息来处理负载数据。 5. **离开组播组**: - 当不再需要接收组...
`receive()`会阻塞直到有数据到达,所以通常我们会在一个独立的线程中执行这个操作: ```java byte[] buffer = new byte[1024]; DatagramPacket packet = new DatagramPacket(buffer, buffer.length); while (true)...
`receive()` 是阻塞的,直到接收到数据才会返回: ```java byte[] buffer = new byte[1024]; DatagramPacket receivedPacket = new DatagramPacket(buffer, buffer.length); socket.receive(receivedPacket); ...
在Java编程语言中,组播通信是一种网络通信技术,它允许单个数据源向多个接收者同时发送数据,而无需为每个接收者单独发送。这种技术基于Internet协议组播(IP Multicast),大大提高了效率,尤其适用于实时流媒体、...
最后,通过`MulticastSocket`的`send()`方法发送数据包,并在完成后关闭Socket。 服务器端部分: 服务器端同样使用`MulticastSocket`来接收多播数据。与客户端不同的是,服务器端需要加入多播组以便接收数据。在`...
此外,为了实现更复杂的组播功能,如动态加入/离开组、组播组管理等,可以使用`java.nio`包中的非阻塞I/O或NIO.2(Java新I/O API)。 总之,Java的组播功能通过`MulticastSocket`类提供了一种有效、灵活的方式,...