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());
相关推荐
在实现UDP多播时,我们需要配置W5500的多播地址过滤,使其能够识别并接收特定的多播数据包。这通常涉及到设置MAC地址和多播过滤器寄存器。 STM32的固件开发中,实现UDP多播功能需要以下步骤: 1. 初始化W5500:...
本篇将重点介绍如何利用C语言编写UDP多播程序,涉及的知识点包括: 1. **UDP协议**:UDP是传输层的协议,它不像TCP那样提供面向连接、顺序传输和错误检测的服务,而是直接将数据报发送到网络上,不保证数据包的顺序...
QT5的UDP多播测试代码 QT5.12,带界面,按钮,测试,有助于理解组播的
多播是UDP的一种应用方式,允许发送者向一组特定的接收者(多播组)广播数据,而无需为每个接收者单独发送。这种机制特别适用于实时流媒体、在线会议和分布式系统等场景,因为它可以有效地利用网络带宽。 本文将...
在多播中,UDP被广泛使用,因为它允许一个发送者向多个接收者同时发送数据,而无需为每个接收者建立单独的连接。下面我们将详细介绍如何使用C语言来实现UDP多播。 首先,你需要包含必要的头文件,如`#include ...
多播是UDP的一种特殊形式,它允许一个发送者向多个接收者同时发送数据,而无需为每个接收者建立单独的连接。这种通信方式在视频流、在线广播或者网络会议等应用中非常常见。 标题中的"Linux下udp多播程序"指的是在...
本文将深入探讨如何使用Java来实现TCP/IP通信,并简要提及UDP多播的概念。TCP(传输控制协议)和IP(互联网协议)是互联网通信的基石,而Java提供了一套强大的API来支持这两种协议的网络编程。 首先,TCP是一种面向...
### 基于UDP多播聊天室的关键技术与实现细节 #### 一、项目概述 本项目旨在构建一个基于UDP多播技术的群聊服务器及其客户端应用。通过使用多播技术,可以实现在网络中向特定组内的所有成员高效地传输数据包。此...
- [高效可靠的UDP单播、UDP多播和IPC消息传输 - 我爱学习网](高效可靠的UDP单播、UDP多播和IPC消息传输 - 我爱学习网.url) 这些链接提供了关于Aeron的更详细介绍和使用指南,帮助开发者进一步探索和应用可靠UDP传输...
标题中的“IOCP.client.UDP.multicast.rar”指的是一个使用IOCP(I/O完成端口)技术实现的UDP多播客户端的压缩包文件。IOCP是Windows操作系统中一种高效的I/O模型,它允许应用程序处理大量的并发I/O操作,特别适合于...
在多播模式下,UDP允许一个发送者向多个接收者发送数据,而无需为每个接收者建立单独的连接。这在广播式通信、流媒体服务、在线游戏以及分布式系统中非常常见。多播地址是IPv4地址范围中的一部分(224.0.0.0到239....
本软件具有MD5校验和,基于UDP协议编写了多播的服务器与客户端,可以传输文件,同时具有重传机制。
在Windows平台上,使用UDP进行多播需要利用Winsock库,这是Windows提供的网络编程接口。在VC6.0(Visual C++ 6.0)环境下,开发者可以使用Winsock2.h头文件和相应的API函数来实现多播功能。 这个"vc udp 多播 简单...
UDP(User Datagram Protocol)是一种无连接的传输层协议,它提供了面向无连接的服务,相比于TCP,UDP更加轻量级,不保证数据包的顺序、可靠性和完整性,但正因为这些特性,UDP在实时通信、多播等场景下有着广泛的...
在VC++环境中进行UDP多播组通信,需要掌握以下关键知识点: 1. **UDP套接字编程**:首先,你需要创建一个UDP套接字。在Windows环境下,可以使用`socket()`函数创建,然后使用`bind()`函数绑定本地端口,以便发送和...
本系统采用多播技术,实现了一套高效的视频会议解决方案,涵盖了视频采集、压缩解压和播放等功能,并且利用UDP多播协议,能够在同一局域网内的多台计算机间实现流畅的视频通信。 ### 1. 视频采集 视频采集是整个...
本文将深入探讨基于UDP(User Datagram Protocol)的多播文件传输技术,以及如何利用分片策略来实现这一功能。 首先,UDP是一种无连接的传输层协议,它不提供可靠性保证,但具有较低的开销和较高的传输效率。在多播...
【基于UDP多播聊天室】的设计与实现 UDP(User Datagram Protocol)多播是一种网络通信技术,常用于向多个接收者高效地广播数据,而无需为每个接收者单独建立连接。在本文中,我们将深入探讨如何使用C语言在Linux...
在多播中,UDP被广泛使用,因为它允许一次性将数据发送到多个接收者,而无需为每个接收者建立单独的连接。这种通信模式非常适合实时流媒体、在线会议和大规模数据分发等场景。 在这个"UDP组播/多播示例程序"中,...