`
yuancihang
  • 浏览: 144997 次
  • 性别: Icon_minigender_1
  • 来自: 洛阳
社区版块
存档分类
最新评论

UDP 多播

    博客分类:
  • java
 
阅读更多

 

package tmp.net.socket.udp;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.util.concurrent.atomic.AtomicBoolean;

public class Multicast {

	private MulticastSocket socket;
	private InetAddress group;
	private int port;
	private MulticastReceiver multicastReceiver;
	
	public Multicast(String ip, int port) throws IOException{
		this.port = port;
		group = InetAddress.getByName(ip);
		socket = new MulticastSocket(port);
		socket.joinGroup(group);
	}
	
	public void startReceive(DatagramPacketReceiver datagramPacketReceiver){
		if(multicastReceiver == null){
			multicastReceiver = new MulticastReceiver(socket, datagramPacketReceiver);
			multicastReceiver.start();
		}
	}
	
	public void send(DatagramPacket datagramPacket) throws IOException{
		datagramPacket.setAddress(group);
		datagramPacket.setPort(port);
		socket.send(datagramPacket);
	}
	
	public void shutdown() {
		if(socket != null){
			try {
				socket.leaveGroup(group);
			} catch (IOException e) {
				e.printStackTrace();
			}
			
			if(multicastReceiver != null){
				multicastReceiver.shutdown();
			}
			
			socket.close();
		}
	}
}

class MulticastReceiver extends Thread{
	
	private MulticastSocket socket;
	private DatagramPacketReceiver datagramPacketReceiver;
	private AtomicBoolean stopping = new AtomicBoolean(false);
	
	public MulticastReceiver(MulticastSocket socket, DatagramPacketReceiver datagramPacketReceiver) {
		super("MulticastReceiver");
		this.socket = socket;
		this.datagramPacketReceiver = datagramPacketReceiver;
	}
	
	public void run(){
		while(!stopping.get()){
			try {
				DatagramPacket datagramPacket = datagramPacketReceiver.newDatagramPacket(); 
				socket.receive(datagramPacket);  
				datagramPacketReceiver.onReceive(datagramPacket);
			} catch (Exception e) {
				e.printStackTrace();
			}   
        } 
	}
	
	public void shutdown(){
		stopping.set(true);
		
		interrupt();
	}
	
}

 

 

package tmp.net.socket.udp;

import java.net.DatagramPacket;

public interface DatagramPacketReceiver {

	public DatagramPacket newDatagramPacket();
	
	public void onReceive(DatagramPacket datagramPacket)throws Exception;
	
}

 

 

package tmp.net.socket.udp;

import java.io.UnsupportedEncodingException;
import java.net.DatagramPacket;
import java.nio.ByteBuffer;

public class PacketBuffer {

	private ByteBuffer buf;
	
	public PacketBuffer(int size){
		buf = ByteBuffer.allocate(size);
	}
	
	public PacketBuffer(byte[] data){
		buf = ByteBuffer.wrap(data);
	}
	
	public int readInt(){
		return buf.getInt();
	}
	
	public void writeInt(int data){
		buf.putInt(data);
	}
	
	public long readLong(){
		return buf.getLong();
	}
	
	public void writeLong(long data){
		buf.putLong(data);
	}
	
	public String readString(){
		int len = buf.getInt();
		switch (len) {
		case -1:
			return null;
		case 0:
			return "";
		default:
			byte[] data = new byte[len];
			buf.get(data);
			try {
				return new String(data, "UTF-8");
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
		}
		return null;
	}
	
	public void writeString(String str){
		if(str == null){
			buf.putInt(-1);
			return ;
		}
		if(str.equals("")){
			buf.putInt(0);
			return ;
		}
		try {
			byte[] data = str.getBytes("UTF-8");
			buf.putInt(data.length);
			buf.put(data);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}
	
	public DatagramPacket build(){
		for(int i = buf.position(); i<buf.limit(); i++){
			buf.put((byte)0);
		}
		return new DatagramPacket(buf.array(), buf.limit());
	}
}

 

测试服务端:

 

Multicast multicast = new Multicast("228.5.6.7", 6789);
		
		multicast.startReceive(new DatagramPacketReceiver(){

			@Override
			public DatagramPacket newDatagramPacket() {
				return new DatagramPacket(new byte[100], 100);
			}

			@Override
			public void onReceive(DatagramPacket datagramPacket) throws Exception {
				PacketBuffer packetBuilder = new PacketBuffer(datagramPacket.getData());
				System.out.println(packetBuilder.readString());
			}
			
		});

 

测试客户端:

 

Multicast multicast = new Multicast("228.5.6.7", 6789);
		
		multicast.startReceive(new DatagramPacketReceiver(){

			@Override
			public DatagramPacket newDatagramPacket() {
				return new DatagramPacket(new byte[100], 100);
			}

			@Override
			public void onReceive(DatagramPacket datagramPacket) throws Exception {
				PacketBuffer packetBuilder = new PacketBuffer(datagramPacket.getData());
				System.out.println(packetBuilder.readString());
			}
			
		});
		
		PacketBuffer packetBuilder = new PacketBuffer(100);
		packetBuilder.writeString("222");
		multicast.send(packetBuilder.build());

 

 

分享到:
评论
1 楼 sp42 2017-02-19  
不错 

相关推荐

    W5500+UDP 多播.rar_W5500 udp 组播_site:www.pudn.com_stn32 w5500组播_w5

    在实现UDP多播时,我们需要配置W5500的多播地址过滤,使其能够识别并接收特定的多播数据包。这通常涉及到设置MAC地址和多播过滤器寄存器。 STM32的固件开发中,实现UDP多播功能需要以下步骤: 1. 初始化W5500:...

    windows网络编程,udp多播例程,基于C语言

    本篇将重点介绍如何利用C语言编写UDP多播程序,涉及的知识点包括: 1. **UDP协议**:UDP是传输层的协议,它不像TCP那样提供面向连接、顺序传输和错误检测的服务,而是直接将数据报发送到网络上,不保证数据包的顺序...

    QT5的UDP多播测试代码 QT5.12

    QT5的UDP多播测试代码 QT5.12,带界面,按钮,测试,有助于理解组播的

    Linux下的udp多播程序

    多播是UDP的一种应用方式,允许发送者向一组特定的接收者(多播组)广播数据,而无需为每个接收者单独发送。这种机制特别适用于实时流媒体、在线会议和分布式系统等场景,因为它可以有效地利用网络带宽。 本文将...

    udp 多播 c语言实现

    在多播中,UDP被广泛使用,因为它允许一个发送者向多个接收者同时发送数据,而无需为每个接收者建立单独的连接。下面我们将详细介绍如何使用C语言来实现UDP多播。 首先,你需要包含必要的头文件,如`#include ...

    Linux下udp多播程序

    多播是UDP的一种特殊形式,它允许一个发送者向多个接收者同时发送数据,而无需为每个接收者建立单独的连接。这种通信方式在视频流、在线广播或者网络会议等应用中非常常见。 标题中的"Linux下udp多播程序"指的是在...

    用JAVA进行TCP-IP-UDP多播网络应用程序编制(英文版).pdf

    本文将深入探讨如何使用Java来实现TCP/IP通信,并简要提及UDP多播的概念。TCP(传输控制协议)和IP(互联网协议)是互联网通信的基石,而Java提供了一套强大的API来支持这两种协议的网络编程。 首先,TCP是一种面向...

    基于UDP多播聊天室

    ### 基于UDP多播聊天室的关键技术与实现细节 #### 一、项目概述 本项目旨在构建一个基于UDP多播技术的群聊服务器及其客户端应用。通过使用多播技术,可以实现在网络中向特定组内的所有成员高效地传输数据包。此...

    可靠udp传输技术 aeron源代码 支持UDP单播、UDP多播

    - [高效可靠的UDP单播、UDP多播和IPC消息传输 - 我爱学习网](高效可靠的UDP单播、UDP多播和IPC消息传输 - 我爱学习网.url) 这些链接提供了关于Aeron的更详细介绍和使用指南,帮助开发者进一步探索和应用可靠UDP传输...

    IOCP.client.UDP.multicast.rar_IOCP_UDP multicast_udp多播

    标题中的“IOCP.client.UDP.multicast.rar”指的是一个使用IOCP(I/O完成端口)技术实现的UDP多播客户端的压缩包文件。IOCP是Windows操作系统中一种高效的I/O模型,它允许应用程序处理大量的并发I/O操作,特别适合于...

    udp.rar_UDP 多播_UDP发送_multicast_udp 可靠传输_udp 接收 c++

    在多播模式下,UDP允许一个发送者向多个接收者发送数据,而无需为每个接收者建立单独的连接。这在广播式通信、流媒体服务、在线游戏以及分布式系统中非常常见。多播地址是IPv4地址范围中的一部分(224.0.0.0到239....

    基于UDP多播传输文件系统

    本软件具有MD5校验和,基于UDP协议编写了多播的服务器与客户端,可以传输文件,同时具有重传机制。

    vc udp 多播 简单例程

    在Windows平台上,使用UDP进行多播需要利用Winsock库,这是Windows提供的网络编程接口。在VC6.0(Visual C++ 6.0)环境下,开发者可以使用Winsock2.h头文件和相应的API函数来实现多播功能。 这个"vc udp 多播 简单...

    UDP 一个多播的聊天程序!

    UDP(User Datagram Protocol)是一种无连接的传输层协议,它提供了面向无连接的服务,相比于TCP,UDP更加轻量级,不保证数据包的顺序、可靠性和完整性,但正因为这些特性,UDP在实时通信、多播等场景下有着广泛的...

    windows下UDP组播(多播)发送和接收程序

    UDP组播,也称为多播,是一种网络通信方式,它允许单个数据源向多个接收者同时发送数据,而无需为每个接收者单独建立连接。这种方式在广播和流媒体服务中尤为常见,因为它能有效利用网络带宽并降低服务器负载。在...

    VC++下UDP多播组网络通信例程,源码可以直接使用

    在VC++环境中进行UDP多播组通信,需要掌握以下关键知识点: 1. **UDP套接字编程**:首先,你需要创建一个UDP套接字。在Windows环境下,可以使用`socket()`函数创建,然后使用`bind()`函数绑定本地端口,以便发送和...

    基于多播的视频会议系统。实现了视频采集,压缩解压,视频播放。网络部分采用UDP多播,可以连接同一局域网内多台电脑进行视频会议

    本系统采用多播技术,实现了一套高效的视频会议解决方案,涵盖了视频采集、压缩解压和播放等功能,并且利用UDP多播协议,能够在同一局域网内的多台计算机间实现流畅的视频通信。 ### 1. 视频采集 视频采集是整个...

    基于UDP的多播文件传输

    本文将深入探讨基于UDP(User Datagram Protocol)的多播文件传输技术,以及如何利用分片策略来实现这一功能。 首先,UDP是一种无连接的传输层协议,它不提供可靠性保证,但具有较低的开销和较高的传输效率。在多播...

    基于UDP多播聊天室.doc

    【基于UDP多播聊天室】的设计与实现 UDP(User Datagram Protocol)多播是一种网络通信技术,常用于向多个接收者高效地广播数据,而无需为每个接收者单独建立连接。在本文中,我们将深入探讨如何使用C语言在Linux...

Global site tag (gtag.js) - Google Analytics