注:该代码创建于2013.12月,是C#下UDP学习时写的代码实例,主要是UdpClient的学习使用。
//2013-12-05 xia-evan using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Net; //添加命名空间 using System.Net.Sockets; using System.Threading; namespace UDP { public partial class UDPFM : Form { public UDPFM() { InitializeComponent(); } /*UdpClient的属性 * Active 获取或设置一个值,该值指示是否已建立默认远程主机。 * udpAvailable 获取从网络接收的可读取的数据量。 * udpClient 获取或设置基础网络 Socket。 * udpDontFragment * 获取或设置 Boolean 值,指定 UdpClient 是否允许对 Internet 协议 (IP) 数据报进行分段。 * udpEnableBroadcast 获取或设置 Boolean 值,指定 UdpClient 是否可以发送或接收广播数据包。 * udpExclusiveAddressUse 获取或设置 Boolean 值,指定 UdpClient 是否只允许一个客户端使用端口。 * udpMulticastLoopback 获取或设置 Boolean 值,指定是否将输出多路广播数据包传递给发送应用程序。 * udpTtl * 获取或设置一个值,指定由 UdpClient 发送的 Internet 协议 (IP) 数据包的生存时间 (TTL)。 * *UdpClient的方法 * AllowNatTraversal 启用或禁用针对 UdpClient 实例的网络地址转换 (NAT) 遍历。 * BeginReceive 从远程主机异步接收数据报。 * BeginSend(Byte[], Int32, AsyncCallback, Object) * 将数据报异步发送到远程主机。 先前已通过调用 Connect 指定目标。 * BeginSend(Byte[], Int32, IPEndPoint, AsyncCallback, Object) * 将数据报异步发送到目标。 目标由 EndPoint 指定。 * BeginSend(Byte[], Int32, String, Int32, AsyncCallback, Object) * 将数据报异步发送到目标。 目标由主机名和端口号指定。 * Close 关闭 UDP 连接。 * Connect(IPEndPoint) 使用指定的网络终结点建立默认远程主机。 * Connect(IPAddress, Int32) 使用指定的 IP 地址和端口号建立默认远程主机。 * Connect(String, Int32) 使用指定的主机名和端口号建立默认远程主机。 * Dispose 释放由 UdpClient 占用的非托管资源,还可以另外再释放托管资源。 * DropMulticastGroup(IPAddress) 退出多路广播组。 * DropMulticastGroup(IPAddress, Int32) 退出多路广播组。 * EndReceive 结束挂起的异步接收。 * EndSend 结束挂起的异步发送。 * Equals(Object) 确定指定的对象是否等于当前对象。 (继承自 Object。) * Finalize 允许对象在“垃圾回收”回收之前尝试释放资源并执行其他清理操作。 (继承自 Object。) * GetHashCode 作为默认哈希函数。 (继承自 Object。) * GetType 获取当前实例的 Type。 (继承自 Object。) * JoinMulticastGroup(IPAddress) 将 UdpClient 添加到多路广播组。 * JoinMulticastGroup(Int32, IPAddress) 将 UdpClient 添加到多路广播组。 * JoinMulticastGroup(IPAddress, Int32) * 将指定的生存时间 (TTL) 与 UdpClient 一起添加到多路广播组。 * JoinMulticastGroup(IPAddress, IPAddress) 将 UdpClient 添加到多路广播组。 * MemberwiseClone 创建当前 Object 的浅表副本。 (继承自 Object。) * Receive 返回已由远程主机发送的 UDP 数据报。 * ReceiveAsync 异步返回已由远程主机发送的 UDP 数据报。 * Send(Byte[], Int32) 将 UDP 数据报发送到远程主机。 * Send(Byte[], Int32, IPEndPoint) 将 UDP 数据报发送到位于指定远程终结点的主机。 * Send(Byte[], Int32, String, Int32) 将 UDP 数据报发送到指定的远程主机上的指定端口。 * SendAsync(Byte[], Int32) 将 UDP 数据报异步发送到远程主机。 * SendAsync(Byte[], Int32, IPEndPoint) 将 UDP 数据报异步发送到远程主机。 * SendAsync(Byte[], Int32, String, Int32) 将 UDP 数据报异步发送到远程主机。 */ //定义网络端点 private IPEndPoint ServerEndPoint = null; //创建网络服务,也就是UDP的Sockets private UdpClient udp = new UdpClient(); //创建网络服务,也就是UDP的Sockets作为一个独立的发送,如果服务器和客户端都有可以共用一个就行 private UdpClient udp_client = new UdpClient(); private bool active = false; //创建一个线程 private Thread thdUdp = null; //定义了一个托管方法 public delegate void DataArrivalEventHandler(string str); #region 网络连接 //监听 protected void Listener(int port) { //将IP地址和端口号以网络端点存储,IPAddress.Any监听所有IP ServerEndPoint = new IPEndPoint(IPAddress.Any, port); //如果已经存在则先关闭 if (udp != null) udp.Close(); try { //创建一个新的端口号 udp = new UdpClient(port); //接收缓冲区大小 udp.Client.ReceiveBufferSize = 1000000000; //发送缓冲区大小 udp.Client.SendBufferSize = 1000000000; active = true; //创建一个线程 thdUdp = new Thread(new ThreadStart(GetUDPData)); //执行当前线程 thdUdp.Start(); } catch (Exception e) { if (udp != null) udp.Close(); if (thdUdp != null) { Thread.Sleep(30); thdUdp.Abort(); } MessageBox.Show(e.ToString()); } } //获取当前接收的消息<线程函数> private void GetUDPData() { while (active) { try { //将获取的远程消息转换成二进制流 byte[] Data = udp.Receive(ref ServerEndPoint); //交换信息的两个线程用的Encoding编码必须一致 string str = Encoding.ASCII.GetString(Data); //-------------------------------------------------- //里面可以创建新线程 //-------------------------------------------------- DataArrivalEventHandler showDate = new DataArrivalEventHandler(MessageAdd); object[] objs = new object[1]; objs[0] = str; Invoke(showDate, objs); Thread.Sleep(0); } catch { } } } //将接收到的消息放入List public void MessageAdd(string str) { lsb_message.Items.Add( DateTime.Now.ToString() + "\t" + str); } //发送信息(与前面的没关系) public void Send(string text, string ipAdr, int port) { //接收方的IP地址 ,IPAddress.Any广播所有 IPAddress ip = IPAddress.Parse(ipAdr); //对方打开监听的端口 int Port = port; //将当前要发送的信息转换成二进制流 byte[] Data = Encoding.ASCII.GetBytes(text); IPEndPoint server = new IPEndPoint(ip, Port); //udp_client.Connect(server); //这句就是发送语句,如果服务器和客户端都有可以共用一个udp就行 udp_client.Send(Data, Data.Length, server); } //关闭监听 private void CloseSocket() { if (udp != null) udp.Close(); if (thdUdp != null) { Thread.Sleep(30); thdUdp.Abort(); } } #endregion //开始监听 private void btn_KS_Click(object sender, EventArgs e) { btn_KS.Enabled = false; btn_JS.Enabled = true; Listener(2000); } //结束监听 private void btn_JS_Click(object sender, EventArgs e) { btn_KS.Enabled = true; btn_JS.Enabled = false; CloseSocket(); } //发送信息 private void btn_FS_Click(object sender, EventArgs e) { Send(txb_message.Text, "127.0.0.1", 2000); } //退出程序 private void UDPFM_FormClosing(object sender, FormClosingEventArgs e) { CloseSocket(); if (udp_client != null) udp_client.Close(); System.Environment.Exit(0);//Application.Exit(); } } }转载标明出处:https://blog.evanxia.com/2015/12/229