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 /********************************************************** ...
随机推荐
- eNSP——交换机基础配置
原理: 交换机之间通过以太网电接口对接时需要协商一-些接口参数, 比如速率.双工模式等.交换机的全双工是指交换机在发送数据的同时也能够接收数据,两者同时进行.就如平时打电话一样,说话的同时也能够听到对 ...
- uva 1400 "Ray, Pass me the dishes!" (区间合并 最大子段和+输出左右边界)
题目链接:https://vjudge.net/problem/UVA-1400 题意:给一串序列,求最大子段,如果有多个,输出字典序最小的那个的左右端点 思路: 之前写过类似的,这个麻烦点需要输出左 ...
- 亿级Web系统搭建――单机到分布式集群 转载
当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题.为了解决这些性能压力带来问题,我们需要在Web系统架构层 ...
- Redis-负载均衡
摘要 在nginx里面配置一个upstream,然后把相关的服务器ip都配置进去.然后采用轮询的方案,然后在nginx里面的配置项里,proxy-pass指向这个upstream,这样就能实现负载均衡 ...
- java xml解析方式(DOM、SAX、JDOM、DOM4J)
XML值可扩展标记语言,是用来传输和存储数据的. XMl的特定: XMl文档必须包含根元素.该元素是所有其他元素的父元素.XML文档中的元素形成了一颗文档树,树中的每个元素都可存在子元素. 所有XML ...
- 【AtCoder】ARC061
ARC061 C - たくさんの数式 / Many Formulas 这个其实\(10^5\)也能做.. 就是\(dp[i]\)表示到第i位的方案数,\(sum[i]\)表示延伸到第i位之前的所有方案 ...
- Mybatis Plus带多条件的多表联合、分页、排序查询
目录 一.现有表 student学生表: facultylist学院表: 二.同时满足以下需求: 1.多表联合查询出学院名字 2.可以带多条件查询 3.指定页码,页数据大小进行物理分页查询 三.解决步 ...
- ACM-ICPC 2018 徐州赛区网络预赛 I. query 树状数组
I. query 题目链接: Problem Description Given a permutation \(p\) of length \(n\), you are asked to answe ...
- DAG添边定理
让DAG变成强连通就是把尾和头连起来,也就是入度和出度为0的点,添的边数:max(num_in==0,num_out==0)
- selenium登录4399
from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from seleni ...