UDP通信多发多收(案例)和广播组播

使用UDP通信方式开发接收端和发送端(模拟视频弹幕系统)

分析:发送端可以一直发送消息   接收端可以不断的接收多个发送端的消息展示     发送端输入exit则结束发送端程序

UDP的接收端为什么可以接收很多发送端的消息 ?

接收端只负责接收数据包,无所谓是哪个发送端的数据包

服务端(接收端)先启动

package UDP多发多收;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class Server {

	public static void main(String[] args) throws Exception  {
		System.out.println("接收端");
		// 创建接收端对象
		DatagramSocket ds=new DatagramSocket(2345);
		
		//创建字节数组装内容
		byte[] arr=new byte[1024*64];
		//创建接收包
		DatagramPacket dp=new DatagramPacket(arr, arr.length);
		while (true) {
			ds.receive(dp);
			int len = dp.getLength();//记录实际长度
			String s = new String(arr, 0, len);
			System.out.println("来自ip为:" + dp.getAddress() + "端口号为:" + dp.getPort() + "的信息:" + s);
		}
		

	}

}

客户端(发送端)

package UDP多发多收;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;

public class Client {

	public static void main(String[] args) throws Exception {
		System.out.println("------发送端-----");
		// 创建发送端对象
		DatagramSocket ds=new DatagramSocket(2222); //系统会随机分端口,也可以直接设置
		//使用扫描器接收用户输入
		Scanner sc=new Scanner(System.in);
		while(true) {
			System.out.println("(输入exit退出)请你输入数据:");
			String s=sc.nextLine();
			if("exit".equals(s)) {
				System.out.println("退出系统");
				ds.close();//关闭资源
			}
			
			byte[] arr=s.getBytes(); //直接打成字节数组
			//创建数据包对象
			DatagramPacket dp=new DatagramPacket(arr, arr.length, InetAddress.getLocalHost(), 2345);
			ds.send(dp);//开始发送
			
		}

	}

}

UDP通信-广播、组播

UDP的三种通信方式

单播:单台主机与单台主机之间的通信

广播:当前主机与所以网络中的索引主机通信

组播:当前主机与选择的一组主机的通信

UDP如何实现广播

使用广播地址255.255.255.255

具体操作:

1发送端发送的数据包的目的地写的是广播地址、且指定端口(255.255.255.255  , 端口号)

2本机所在网段的其他主机的程序只要匹配端口成功就可以接收消息了。(端口号)

InetAddress.getName("255.255.255.255")

UDP如何实现组播

使用组播地址224.0.0.0到239.255.255.255

具体操作

发送端的数据包目的地是组播ip(例如224.0.1.1  端口9999)

接收端必须绑定组播ip(224.0.1.1) 端口还要对应发送端的端口9999 ,这样即可接收组播消息

DatagramSocket的子类MulticaseSocket可以在接收端绑定组播ip



import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.MulticastSocket;
import java.net.NetworkInterface;

public class Test {

	public static void main(String[] args)  throws Exception{
		// TODO Auto-generated method stub
		MulticastSocket mcs=new MulticastSocket();
		//mcs.joinGroup("224.0.0.1");  从JDK14开始已经过时了
		mcs.joinGroup(new InetSocketAddress(InetAddress.getByName("224.0.1.1"), 9999),NetworkInterface.getByInetAddress(InetAddress.getLocalHost()));

	}

}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
下面是一个简单的UE4 C++ UDP通信组播案例。 1. 首先,需要创建一个UDP Socket: ```c++ FSocket* ListenSocket = FUdpSocketBuilder(TEXT("MySocket")).BoundToAddress(FIPv4Address::Any).BoundToPort(3000); ``` 2. 接下来,需要创建一个Multicast组: ```c++ TSharedPtr<FInternetAddr> MulticastAddr = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateInternetAddr(); bool bIsValid; MulticastAddr->SetIp(TEXT("239.255.0.1"), bIsValid); MulticastAddr->SetPort(3000); ``` 3. 然后,将Socket加入到Multicast组: ```c++ ListenSocket->JoinMulticastGroup(*MulticastAddr); ``` 4. 最后,可以使用以下代码来发送和接收消息: ```c++ // 发送消息 FString Message = TEXT("Hello, World!"); TArray<uint8> SendBuffer; FTCHARToUTF8 Converter(*Message); SendBuffer.Append((uint8*)Converter.Get(), Converter.Length()); int32 BytesSent; ListenSocket->SendTo(SendBuffer.GetData(), SendBuffer.Num(), BytesSent, *MulticastAddr); // 接收消息 TArray<uint8> ReceiveBuffer; FIPv4Endpoint Endpoint; if (ListenSocket->HasPendingData(Size)) { ReceiveBuffer.SetNumUninitialized(FMath::Min(Size, 65507u)); int32 BytesRead; ListenSocket->RecvFrom(ReceiveBuffer.GetData(), ReceiveBuffer.Num(), BytesRead, Endpoint); if (BytesRead > 0) { FString Message = FString(UTF8_TO_TCHAR(reinterpret_cast<const char*>(ReceiveBuffer.GetData()))); UE_LOG(LogTemp, Warning, TEXT("Received message: %s"), *Message); } } ``` 这是一个简单的UDP组播通信案例,可以根据自己的实际需求进行修改和扩展。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小萌新上大分

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值