`
wanghailiang333
  • 浏览: 199108 次
  • 性别: Icon_minigender_1
  • 来自: 广西
社区版块
存档分类
最新评论

关于Java的MulticastSocket 同时Receive与Send相互不阻塞

    博客分类:
  • java
 
阅读更多

关于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能同时运行

 

请各位多多指教。

分享到:
评论

相关推荐

    Java网络编程_MulticastSocket类的使用

    * 减少网络阻塞:MulticastSocket 类可以减少网络阻塞,因为服务器程序只需要将数据发送到多点传送组,而不需要对每个客户端进行单独的传输。 五、结论 MulticastSocket 类是 Java 网络编程中的一种非常有用的类,...

    MulticastSocket收发小例子

    在Java的网络编程中,`MulticastSocket`类是一个非常重要的工具,用于处理IP多播通信。IP多播是一种高效的数据传输方式,它允许一个发送者向多个接收者同时发送数据,而无需为每个接收者单独发送一次。这种方式在...

    how to use MulticastSocket

    与单播(一对一)和广播(一对所有)不同,多播(一对多)可以在不重复发送数据的情况下将数据传递给多个接收者。IP多播地址范围为224.0.0.0到239.255.255.255。 使用Java的MulticastSocket,首先需要创建一个...

    Java组播代码

    在Java中,还可以使用`java.net.NetworkInterface`类来获取网络接口信息,并通过`NetworkInterface`对象与`MulticastSocket`交互,实现更精细的组播组管理,如选择特定的网络接口发送或接收多播数据。 8. **多播...

    Java 组播组中发送和接受数据实例

    本实例将深入探讨如何在Java中实现组播数据的发送与接收。 首先,我们需要导入Java的网络编程相关包,特别是`java.net.MulticastSocket`类,这是处理组播的关键: ```java import java.net.*; ``` 发送数据到组播...

    MulticastSocket编程_2

    在Java的网络编程中,`MulticastSocket`是一个非常重要的类,它允许程序接收和发送组播数据包。组播是一种通信方式,其中一条消息可以同时发送到多个目的地,而无需为每个接收者单独发送。这在需要向大量客户端广播...

    java-multicast-instance.rar_java multicast_组播 Java

    "java-multicast-instance.rar"是一个关于Java实现组播功能的实例压缩包,包含了一个具体的编程示例,可以帮助开发者更好地理解和应用Java的组播技术。 在Java中,实现组播功能主要依赖于`java.net.MulticastSocket...

    java源码:Java 组播组中发送和接受数据实例.zip

    在Java中,我们可以使用`java.net.MulticastSocket`类来实现多播功能。这个类提供了加入和离开特定多播组、发送和接收多播数据包的能力。 1. **创建MulticastSocket** 首先,我们需要创建一个`MulticastSocket`...

    Java利用UDP协议实现多广播组通信源码

    4. **接收多播数据**:使用MulticastSocket的receive方法接收数据报包。这个方法是阻塞的,直到有数据可用。收到的数据报包包含发送者的IP地址和端口,以及接收到的数据。 5. **GUI设计**:为了实现可视化操作,...

    java Udp 收发结构体实例 Socket编程

    调用`DatagramSocket.receive()`方法会阻塞,直到接收到一个数据报并将其填充到提供的`DatagramPacket`中。 4. **单向传输**: UDP是无连接的,所以它支持单向传输。如果只需要一方发送数据,另一方接收,只需在...

    java udp socket 网络编程

    以下是一些关于Java UDP套接字网络编程的关键知识点: 1. **DatagramSocket创建与绑定**: - 创建DatagramSocket对象时,可以指定一个端口号。如果不指定,系统会随机分配一个。 - 使用`bind()`方法将...

    基于UDP的网络编程-1

    Java提供了MulticastSocket类处理多播。 10. UDP安全性与优化: 虽然UDP的不可靠性可能带来数据丢失等问题,但可以通过应用层的机制(如序列号、确认机制等)来部分弥补。同时,注意防范UDP Flood攻击,适当限制...

    java实现p2p通信

    ### Java实现P2P通信的关键知识点 #### 一、P2P通信模型及关键技术分析 ##### (一)信息的传递 **1. P2P通信模型** P2P(Peer-to-Peer)通信模型是一种分布式网络架构,其中的每一个节点既是服务的提供者也是...

    jrtp组播发送接收代码

    - 调用`MulticastSocket`的`receive(DatagramPacket packet)`方法,它会阻塞直到接收到一个数据包。 - 接收到的数据包包含RTP头信息,可以解析这些信息来处理负载数据。 5. **离开组播组**: - 当不再需要接收组...

    android 多播 简单例程

    `receive()`会阻塞直到有数据到达,所以通常我们会在一个独立的线程中执行这个操作: ```java byte[] buffer = new byte[1024]; DatagramPacket packet = new DatagramPacket(buffer, buffer.length); while (true)...

    Java 组播组中发送和接受数据源码实例

    `receive()` 是阻塞的,直到接收到数据才会返回: ```java byte[] buffer = new byte[1024]; DatagramPacket receivedPacket = new DatagramPacket(buffer, buffer.length); socket.receive(receivedPacket); ...

    组播组中发送和接受数据.rar

    在Java编程语言中,组播通信是一种网络通信技术,它允许单个数据源向多个接收者同时发送数据,而无需为每个接收者单独发送。这种技术基于Internet协议组播(IP Multicast),大大提高了效率,尤其适用于实时流媒体、...

    socket通讯

    最后,通过`MulticastSocket`的`send()`方法发送数据包,并在完成后关闭Socket。 服务器端部分: 服务器端同样使用`MulticastSocket`来接收多播数据。与客户端不同的是,服务器端需要加入多播组以便接收数据。在`...

    MulticastSystem

    此外,为了实现更复杂的组播功能,如动态加入/离开组、组播组管理等,可以使用`java.nio`包中的非阻塞I/O或NIO.2(Java新I/O API)。 总之,Java的组播功能通过`MulticastSocket`类提供了一种有效、灵活的方式,...

Global site tag (gtag.js) - Google Analytics