跳到主要内容
版本:3.0

创建UdpSession

定义

命名空间:TouchSocket.Sockets
程序集:TouchSocket.dll

一、说明

UDP组件是基于UDP协议的最基础组件,其功能简单,易用。它既能充当服务器,又能够作为客户端。

二、产品特点

  • 简单易用。
  • 多线程重叠IO。
  • 内存池
  • 高性能
  • 支持组播、广播
  • 支持插件扩展
  • 支持跨平台

三、产品应用场景

  • UDP基础使用场景:可跨平台、跨语言使用。

四、支持插件接口

插件方法功能
IUdpReceivedPlugin在收到数据时触发

五、使用UdpSession

5.1 作为服务器使用

var udpService = new UdpSession();
udpService.Received = (c,e) =>
{
Console.WriteLine(e.ByteBlock.ToString());
return EasyTask.CompletedTask;
};
udpService.Setup(new TouchSocketConfig()
.SetBindIPHost(new IPHost(7789)));
udpService.Start();
Console.WriteLine("等待接收");

5.2 作为客户端使用

var udpClient = new UdpSession();
udpClient.Setup(new TouchSocketConfig()
//.UseUdpReceive()//作为客户端时,如果需要接收数据,那么需要绑定端口。要么使用SetBindIPHost指定端口,要么调用UseUdpReceive绑定随机端口。
.SetBindIPHost(new IPHost(7788)));
udpClient.Start();
注意
  1. 即使不监听地址,Setup和Start都是必须要的。
  2. 当udp作为客户端时,Config如果不设置SetBindIPHost,将不会接收,如果不知道绑定那个端口,可以直接绑定0端口(或者使用UseUdpReceive),这样,就会使用系统空闲的一个端口了。

六、发送数据

框架内置很多发送发送。但是大致可分为两种。一种是带参数EndPoint,和一种不带的。

6.1 发送到指定地址

EndPoint,即表示可以发送到任意终结点。

public virtual void SendAsync(EndPoint remoteEP, byte[] buffer, int offset, int length)

6.2 发送到接收数据的地址

一般的,当udp收到数据时,都能获取到UdpReceivedDataEventArgs参数。然后通过该参数,能获取到接收数据的EndPoint。然后向这个终结点发送数据。发送方就能收到数据。

例如:

class MyPluginClass : PluginBase, IUdpReceivedPlugin
{
public async Task OnUdpReceived(IUdpSession client, UdpReceivedDataEventArgs e)
{
await client.SendAsync(e.EndPoint, "RRQM");
await e.InvokeNext();
}
}

6.3 发送到默认地址

不带EndPoint,即表示直接发送到默认(通过SetRemoteIPHost设置)的终结点。这一般在Udp作为客户端时是有用的。

public virtual void SendAsync(byte[] buffer, int offset, int length)

七、接收数据

7.1 委托接收

委托接收,则是直接订阅Received即可。

var udpService = new UdpSession();
udpService.Received = (c, e) =>
{
Console.WriteLine(e.ByteBlock.ToString());
return EasyTask.CompletedTask;
};
udpService.Start(7789);

7.2 插件接收

使用插件接收,可以很好的分离业务。

声明插件

class MyPluginClass1 : PluginBase, IUdpReceivedPlugin
{
public async Task OnUdpReceived(IUdpSession client, UdpReceivedDataEventArgs e)
{
var msg = e.ByteBlock.ToString();
if (msg == "hello")
{
Console.WriteLine("已处理Hello");
}
else
{
//如果判断逻辑发现此处无法处理,即可转到下一个插件
await e.InvokeNext();
}
}
}

class MyPluginClass2 : PluginBase, IUdpReceivedPlugin
{
public async Task OnUdpReceived(IUdpSession client, UdpReceivedDataEventArgs e)
{
var msg = e.ByteBlock.ToString();
if (msg == "hi")
{
Console.WriteLine("已处理Hi");
}
else
{
//如果判断逻辑发现此处无法处理,即可转到下一个插件
await e.InvokeNext();
}
}
}

使用插件

var udpService = new UdpSession();
udpService.Setup(new TouchSocketConfig()
.SetBindIPHost(new IPHost(7789))
.ConfigurePlugins(a =>
{
a.Add<MyPluginClass1>();
a.Add<MyPluginClass2>();
}));
udpService.Start();

八、本文示例Demo