C# UdpClient使用
客户端:
- public class UdpClientManager
- {
- //接收数据事件
- public Action<string> recvMessageEvent = null;
- //发送结果事件
- public Action<int> sendResultEvent = null;
- //本地监听端口
- public int localPort = 0;
- private UdpClient udpClient = null;
- public UdpClientManager(int localPort)
- {
- if (localPort < 0 || localPort > 65535)
- throw new ArgumentOutOfRangeException("localPort is out of range");
- this.localPort = localPort;
- }
- public void Start()
- {
- while (true)
- {
- try
- {
- udpClient = new UdpClient(localPort, AddressFamily.InterNetwork);//指定本地监听port
- ReceiveMessage();
- break;
- }
- catch (Exception)
- {
- Thread.Sleep(100);
- }
- }
- }
- private async void ReceiveMessage()
- {
- while (true)
- {
- if (udpClient == null)
- return;
- try
- {
- UdpReceiveResult udpReceiveResult = await udpClient.ReceiveAsync();
- string message = Encoding.UTF8.GetString(udpReceiveResult.Buffer);
- if (recvMessageEvent != null)
- recvMessageEvent(message);
- }
- catch (Exception ex)
- {
- }
- }
- }
- //单播
- public async void SendMessageByUnicast(string message, string destHost, int destPort)
- {
- if (string.IsNullOrEmpty(message))
- throw new ArgumentNullException("message cant not null");
- if (udpClient == null)
- throw new ArgumentNullException("udpClient cant not null");
- if (string.IsNullOrEmpty(destHost))
- throw new ArgumentNullException("destHost cant not null");
- if (destPort < 0 || destPort > 65535)
- throw new ArgumentOutOfRangeException("destPort is out of range");
- byte[] buffer = Encoding.UTF8.GetBytes(message);
- int len = 0;
- for (int i = 0; i < 3; i++)
- {
- try
- {
- len = await udpClient.SendAsync(buffer, buffer.Length, new IPEndPoint(IPAddress.Parse(destHost), destPort));
- }
- catch (Exception)
- {
- len = 0;
- }
- if (len <= 0)
- Thread.Sleep(100);
- else
- break;
- }
- if (sendResultEvent != null)
- sendResultEvent(len);
- }
- public void CloseUdpCliend()
- {
- if (udpClient == null)
- throw new ArgumentNullException("udpClient cant not null");
- try
- {
- udpClient.Client.Shutdown(SocketShutdown.Both);
- }
- catch (Exception)
- {
- }
- udpClient.Close();
- udpClient = null;
- }
- }
服务器:
- public class UdpServiceManager
- {
- private readonly string broadCastHost = "255.255.255.255";
- //接收数据事件
- public Action<string> recvMessageEvent = null;
- //发送结果事件
- public Action<int> sendResultEvent = null;
- //本地host
- private string localHost = "";
- //本地port
- private int localPort = 0;
- private UdpClient udpClient = null;
- public UdpServiceManager(string localHost, int localPort)
- {
- if (string.IsNullOrEmpty(localHost))
- throw new ArgumentNullException("localHost cant not null");
- if (localPort < 0 || localPort > 65535)
- throw new ArgumentOutOfRangeException("localPort is out of range");
- this.localHost = localHost;
- this.localPort = localPort;
- }
- public void Start()
- {
- while (true)
- {
- try
- {
- udpClient = new UdpClient(new IPEndPoint(IPAddress.Parse(localHost), localPort));//绑定本地host和port
- ReceiveMessage();
- break;
- }
- catch (Exception)
- {
- Thread.Sleep(100);
- }
- }
- }
- private async void ReceiveMessage()
- {
- while (true)
- {
- if (udpClient == null)
- return;
- try
- {
- UdpReceiveResult udpReceiveResult = await udpClient.ReceiveAsync();
- string message = Encoding.UTF8.GetString(udpReceiveResult.Buffer);
- if (recvMessageEvent != null)
- recvMessageEvent(message);
- }
- catch (Exception)
- {
- }
- }
- }
- //单播
- public async void SendMessageByUnicast(string message, string destHost, int destPort)
- {
- if (string.IsNullOrEmpty(message))
- throw new ArgumentNullException("message cant not null");
- if (string.IsNullOrEmpty(destHost))
- throw new ArgumentNullException("destHost cant not null");
- if (destPort < 0 || destPort > 65535)
- throw new ArgumentOutOfRangeException("destPort is out of range");
- if (udpClient == null)
- throw new ArgumentNullException("udpClient cant not null");
- byte[] buffer = Encoding.UTF8.GetBytes(message);
- int len = 0;
- for (int i = 0; i < 3; i++)
- {
- try
- {
- len = await udpClient.SendAsync(buffer, buffer.Length, destHost, destPort);
- }
- catch (Exception)
- {
- len = 0;
- }
- if (len <= 0)
- Thread.Sleep(100);
- else
- break;
- }
- if (sendResultEvent != null)
- sendResultEvent(len);
- }
- //广播
- public async void SendMessageByBroadcast(string message)
- {
- if (string.IsNullOrEmpty(message))
- throw new ArgumentNullException("message cant not null");
- if (udpClient == null)
- throw new ArgumentNullException("udpClient cant not null");
- byte[] buffer = Encoding.UTF8.GetBytes(message);
- int len = 0;
- for (int i = 0; i < 3; i++)
- {
- try
- {
- len = await udpClient.SendAsync(buffer, buffer.Length, broadCastHost, localPort);
- }
- catch (Exception ex)
- {
- len = 0;
- }
- if (len <= 0)
- Thread.Sleep(100);
- else
- break;
- }
- if (sendResultEvent != null)
- sendResultEvent(len);
- }
- public void CloseUdpCliend()
- {
- if (udpClient == null)
- throw new ArgumentNullException("udpClient cant not null");
- try
- {
- udpClient.Client.Shutdown(SocketShutdown.Both);
- }
- catch (Exception)
- {
- }
- udpClient.Close();
- udpClient = null;
- }
- }
多播方式
- public class UdpClientManager
- {
- //接收数据事件
- public Action<string> recvMessageEvent = null;
- //发送结果事件
- public Action<int> sendResultEvent = null;
- //本地监听端口
- public int localPort = 0;
- //组播地址
- public string MultiCastHost = "";
- private UdpClient udpClient = null;
- public UdpClientManager(int localPort, string MultiCastHost)
- {
- if (localPort < 0 || localPort > 65535)
- throw new ArgumentOutOfRangeException("localPort is out of range");
- if (string.IsNullOrEmpty(MultiCastHost))
- throw new ArgumentNullException("message cant not null");
- this.localPort = localPort;
- this.MultiCastHost = MultiCastHost;
- }
- public void Start()
- {
- while (true)
- {
- try
- {
- udpClient = new UdpClient(localPort, AddressFamily.InterNetwork);//指定本地监听port
- udpClient.JoinMulticastGroup(IPAddress.Parse(MultiCastHost));
- ReceiveMessage();
- break;
- }
- catch (Exception)
- {
- Thread.Sleep(100);
- }
- }
- }
- private async void ReceiveMessage()
- {
- while (true)
- {
- if (udpClient == null)
- return;
- try
- {
- UdpReceiveResult udpReceiveResult = await udpClient.ReceiveAsync();
- string message = Encoding.UTF8.GetString(udpReceiveResult.Buffer);
- if (recvMessageEvent != null)
- recvMessageEvent(message);
- }
- catch (Exception ex)
- {
- }
- }
- }
- public async void SendMessageByMulticast(string message)
- {
- if (string.IsNullOrEmpty(message))
- throw new ArgumentNullException("message cant not null");
- if (udpClient == null)
- throw new ArgumentNullException("udpClient cant not null");
- byte[] buffer = Encoding.UTF8.GetBytes(message);
- int len = 0;
- for (int i = 0; i < 3; i++)
- {
- try
- {
- len = await udpClient.SendAsync(buffer, buffer.Length, new IPEndPoint(IPAddress.Parse(MultiCastHost), localPort));
- }
- catch (Exception)
- {
- len = 0;
- }
- if (len <= 0)
- Thread.Sleep(100);
- else
- break;
- }
- if (sendResultEvent != null)
- sendResultEvent(len);
- }
- public void CloseUdpCliend()
- {
- if (udpClient == null)
- throw new ArgumentNullException("udpClient cant not null");
- try
- {
- udpClient.Client.Shutdown(SocketShutdown.Both);
- }
- catch (Exception)
- {
- }
- udpClient.Close();
- udpClient = null;
- }
- }
C# UdpClient使用的更多相关文章
- C# UdpClient使用Receive和BeginReceive接收消息时的不同写法
使用Receive(同步阻塞方式), 注意使用同步方法时,需要使用线程来开始方法,不然会使UI界面卡死 IPEndPoint RemoteIpEndPoint = ); UdpClient udpCl ...
- UDPClient的用法
UDP_Server: UdpClient receivingUdpClient = ); IPEndPoint RemoteIpEndPoint = ); try { byte[] sdata = ...
- Socket的三个功能类TCPClient、TCPListener 和 UDPClient (转)
应用程序可以通过 TCPClient.TCPListener 和 UDPClient 类使用传输控制协议 (TCP) 和用户数据文报协议 (UDP) 服务.这些协议类建立在 System.Net.So ...
- C#使用 UdpClient 类进行简单通信的例子
UdpClient 类提供了一些简单的方法,用于在阻止同步模式下发送和接收无连接 UDP 数据报. 因为 UDP 是无连接传输协议,所以不需要在发送和接收数据前建立远程主机连接.但您可以选择使用下面两 ...
- C# UdpClient 设置超时时间
/********************************************************************** * C# UdpClient 设置超时时间 * 说明: ...
- UdpClient的Connect究竟做了什么(转)
最近在写一个音频通信的系统,因为需要还要处理其他事件,所以就自己设计底层的通信协议,用了不少底层的Socket编程(.Net Framework),搞清楚了不少细节问题. 先做一些铺垫工作.音频系统服 ...
- 【socket】一分钟理清 socket udpsocket tcpsocket tcplistener TCPClient和 UDPClient
socket 套接字接口是各种语言tcp udp的网络操作的基础. 直接用socket 对象开发 可以选择 udpsocket 或者 tcpsocket ,两者在使用上仅一些方法和参数不同,所有的底 ...
- 【socket】Socket的三个功能类TCPClient、TCPListener 和 UDPClient
Socket的三个功能类TCPClient.TCPListener 和 UDPClient (转) 应用程序可以通过 TCPClient.TCPListener 和 UDPClient 类使用传输控制 ...
- uip UDPclient模式通信移植,当地port随机
现在移植UDPclient模式,测试广播地址. //udp_client.c /************************************************************ ...
- uip UDPclient模式通信移植,p本地ort可以是无规
现在移植UDPclient模式,使用广播地址检测. //udp_client.c /********************************************************** ...
随机推荐
- TMS320C6455小介绍
TMS320C6455是TI公司推出的的一款新型高性能单核定点DSP.它是TI公司基于第三代先进VeloviTI VLIW(超长指令字)结构开发出来的新产品,在通信,医疗图像,无线传输方面都可以大有作 ...
- Spring分层次建包
1.包分三层 配置包 控制器包 模型包 视图层 模板放 src/main/resources下的templates目录下
- [转帖]四个修改Docker默认存储位置的方法
四个修改Docker默认存储位置的方法 https://blog.51cto.com/forangela/1949947 易改乾坤关注0人评论27435人阅读2017-07-22 09:18:48 ...
- js中实现输入框类似百度搜索的智能提示效果
说明:我这里显示的数据采用词典(词典在js中自定义的,看下面文字),主要显示key. 页面元素: <style type="text/css">.search { le ...
- mysql8.0.13下载与安装图文教程
一.进入mysql网站:https://dev.mysql.com/downloads/mysql/ 二.进入Community选择MySQL Communtiy Server 三.将页面拉到最下面选 ...
- Let's Code
Let's Code Happy Coding, Happy OI #include <bits/stdc++.h> using namespace std; int main() { c ...
- 用python库openpyxl操作excel,从源excel表中提取信息复制到目标excel表中
现代生活中,我们很难不与excel表打交道,excel表有着易学易用的优点,只是当表中数据量很大,我们又需要从其他表册中复制粘贴一些数据(比如身份证号)的时候,我们会越来越倦怠,毕竟我们不是机器,没法 ...
- 洛谷P1087 FBI树
P1087 FBI树题解: 看到这个题,我想到了线段树!(毕竟刚搞完st表...) 当然,题解中有位大佬也用的线段树,但是当时看的时候我看见了9个if,当场去世. 那么这是一个不用暴力的线段树,且简单 ...
- 【hash表】收集雪花
[哈希和哈希表]收集雪花 题目描述 不同的雪花往往有不同的形状.在北方的同学想将雪花收集起来,作为礼物送给在南方的同学们.一共有n个时刻,给出每个时刻下落雪花的形状,用不同的整数表示不同的形状.在收集 ...
- 指针生成网络(Pointer-Generator-Network)原理与实战
指针生成网络(Pointer-Generator-Network)原理与实战 阅读目录 0 前言 1 Baseline sequence-to-sequence 2 Pointer-Generat ...