注:该代码创建于2013.12月,是C#下UDP学习时写的代码实例,主要是UdpClient的学习使用。
/*2013-12-08_xia-evan * 也可以用UDP的方式自己定义线程实现,本例中用的是封装好的函数 * private bool active = false; * private Thread thdTcp = null; //创建一个线程 * public delegate void DataArrivalEventHandler(string str); //定义了一个托管方法 */ using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Threading; using System.Net; using System.Net.Sockets; namespace TCP { public partial class TCPFM : Form { public TCPFM() { InitializeComponent(); } /* *TcpListener的属性 * Active 获取一个值,该值指示 TcpListener 是否正主动侦听客户端连接。 * ExclusiveAddressUse * 获取或设置一个 Boolean 值,该值指定 TcpListener 是否只允许一个基础套接字来侦听特定端口。 * LocalEndpoint 获取当前 TcpListener 的基础 EndPoint。 * Server 获取基础网络 Socket。 * *TcpListener的方法 * AcceptSocket 接受挂起的连接请求。 * AcceptSocketAsync 接受挂起的连接请求以作为异步操作。 * AcceptTcpClient 接受挂起的连接请求。 * AcceptTcpClientAsync 以异步操作方式接受挂起的连接请求。 * AllowNatTraversal 启用或禁用针对 TcpListener 实例的网络地址转换 (NAT) 遍历。 * BeginAcceptSocket 开始一个异步操作来接受一个传入的连接尝试。 * BeginAcceptTcpClient 开始一个异步操作来接受一个传入的连接尝试。 * Create 创建一个新的侦听指定端口的 TcpListener 实例。 * EndAcceptSocket 异步接受传入的连接尝试,并创建新的 Socket 来处理远程主机通信。 * EndAcceptTcpClient 异步接受传入的连接尝试,并创建新的 TcpClient 来处理远程主机通信。 * Equals(Object) 确定指定的对象是否等于当前对象。 (继承自 Object。) * Finalize 允许对象在“垃圾回收”回收之前尝试释放资源并执行其他清理操作。 (继承自 Object。) * GetHashCode 作为默认哈希函数。 (继承自 Object。) * GetType 获取当前实例的 Type。 (继承自 Object。) * MemberwiseClone 创建当前 Object 的浅表副本。 (继承自 Object。) * Pending 确定是否有挂起的连接请求。 * Start() 开始侦听传入的连接请求。 * Start(Int32) 启动对具有最大挂起连接数的传入连接请求的侦听。 * Stop 关闭侦听器。 */ //定义了一个托管方法 public delegate void DataArrivalEventHandler(string str); #region 异步接收数据 //定义网络端点 private IPEndPoint ServerEndPoint = null; //创建网络服务,也就是TCP的Sockets private TcpListener tcp_listener = null;//new TcpListener(); private TcpClient tcp_client = null; //监听 public void Listener(int port) { //将IP地址和端口号以网络端点存储,IPAddress.Any监听所有IP ServerEndPoint = new IPEndPoint(IPAddress.Any, port); //如果已经存在则先关闭 if (tcp_listener != null) tcp_listener.Stop(); try { tcp_listener = new TcpListener(ServerEndPoint); tcp_listener.Start(); //【异步】接受客户端的连接请求 ClientConnect为连接的回调函数 tcp_listener.BeginAcceptTcpClient(ServerConnectCallBack,tcp_listener); } catch (Exception ex) { if (tcp_listener != null) tcp_listener.Stop(); MessageBox.Show("函数Listener出错:\n" + ex.Message.ToString()); } } //接收连接回调函数<接收连接后调用方> private void ServerConnectCallBack(IAsyncResult ar) { try { TcpListener listener = (TcpListener)ar.AsyncState; TcpClient client = listener.EndAcceptTcpClient(ar); //--------------------------------------------------- DataArrivalEventHandler showDate = new DataArrivalEventHandler(MessageAdd); object[] objs = new object[1]; objs[0] = "服务器:接收连接:成功!"; Invoke(showDate, objs); //--------------------------------------------------- //while (client.Connected) //{ //Thread.Sleep(1000); RecieveData(client); //} } catch(Exception ex) { MessageBox.Show("函数ServerConnectCallBack出错:\n" + ex.Message.ToString()); } } //接受数据函数 private void RecieveData(TcpClient client) { // 调用异步方法 BeginReceive 来告知 socket 如何接收数据 try { //创建于服务器连接的数据流 NetworkStream stream = client.GetStream(); byte[] data = new byte[1024] ;//Encoding.ASCII.GetBytes(str); //【异步】接收数据后 stream.BeginRead(data, 0, data.Length, RecieveDataCallback, stream); string str = Encoding.ASCII.GetString(data); //---------------------------------- DataArrivalEventHandler showDate = new DataArrivalEventHandler(MessageAdd); object[] objs = new object[1]; objs[0] = String.Format("接收数据为:" + str); Invoke(showDate, objs); //---------------------------------- } catch (Exception ex) { MessageBox.Show("函数ServerRecieveData出错:\n" + ex.Message.ToString()); } } //接收数据回调函数 private void RecieveDataCallback(IAsyncResult iar) { //接收到的数据长度. try { //停一段时间,用于接收 Thread.Sleep(200); NetworkStream stream = (NetworkStream)iar.AsyncState; int l = stream.EndRead(iar); if (l > 0) { //---------------------------------- DataArrivalEventHandler showDate = new DataArrivalEventHandler(MessageAdd); object[] objs = new object[1]; objs[0] = String.Format("接收数据成功!"); Invoke(showDate, objs); //---------------------------------- } } catch (Exception ex) { MessageBox.Show("函数ServerRecieveDataCallback出错:\n" + ex.Message.ToString()); } } //发送数据 public void SendData(TcpClient client, string str) { try { if (client.Connected) { //创建于服务器连接的数据流 NetworkStream stream = client.GetStream(); byte[] data = Encoding.ASCII.GetBytes(str); //异步发送数据 stream.BeginWrite(data, 0, data.Length, new AsyncCallback(SendDataCallBack), stream); //---------------------------------- DataArrivalEventHandler showDate = new DataArrivalEventHandler(MessageAdd); object[] objs = new object[1]; objs[0] = "发送数据为:" + str; Invoke(showDate, objs); //---------------------------------- } else throw new Exception("连接未打开!"); } catch (Exception ex) { MessageBox.Show("函数SendData出错:\n" + ex.Message.ToString()); } } //发送数据回调函数<发送结束后调用> private void SendDataCallBack(IAsyncResult iar) { try { //等待数据发出 Thread.Sleep(200); NetworkStream stream = (NetworkStream)iar.AsyncState; int l = stream.EndRead(iar); if (l > 0) { //---------------------------------- DataArrivalEventHandler showDate = new DataArrivalEventHandler(MessageAdd); object[] objs = new object[1]; objs[0] = "发送数据成功!"; Invoke(showDate, objs); //---------------------------------- } } catch (Exception ex) { MessageBox.Show("函数SendDataCallBack出错:\n" + ex.Message.ToString()); } } //客户端连接 public void ClientConnect(string ip, int port) { try { tcp_client = new TcpClient(); //根据服务器的IP地址和端口号 异步连接服务器 tcp_client.BeginConnect(ip, Convert.ToInt32(port), new AsyncCallback(ClientConnectCallback), tcp_client); } catch (Exception ex) { MessageBox.Show("函数ClientConnect出错:\n" + ex.Message.ToString()); } } //异步连接的回调函数<连接成功后调用> private void ClientConnectCallback(IAsyncResult ar) { TcpClient t = (TcpClient)ar.AsyncState; try { if (t.Connected) { t.EndConnect(ar);//函数运行到这里就说明连接成功 //---------------------------------- DataArrivalEventHandler showDate = new DataArrivalEventHandler(MessageAdd); object[] objs = new object[1]; objs[0] = "客户端:发起连接:成功!"; Invoke(showDate, objs); //---------------------------------- SendData(t, txb_message.Text.Trim()); } else { DataArrivalEventHandler showDate = new DataArrivalEventHandler(MessageAdd); object[] objs = new object[1]; objs[0] = "客户端:连接:失败!"; Invoke(showDate, objs); } } catch (Exception ex) { MessageBox.Show("函数ClientConnectCallback出错:\n" + ex.Message.ToString()); } } #endregion #region=== //将接收到的消息放入List public void MessageAdd(string str) { lsb_message.Items.Add(DateTime.Now.ToString() + "\t" + str); } /*//中断连接 private void btn_int_Click(object sender, EventArgs e) { try { if(tcp_client!=null && tcp_client.Connected) { tcp_client.Close(); MessageAdd("客户端:结束连接!"); } btn_Conn.Enabled = true; } catch (Exception ex) { MessageBox.Show("函数btn_int_Click出错:\n" + ex.Message.ToString()); } } //建立连接 private void btn_Conn_Click(object sender, EventArgs e) { try { ClientConnect(txb_ip.Text.Trim(), Convert.ToInt32(txb_port.Text.Trim())); btn_Conn.Enabled = false; } catch (Exception ex) { MessageBox.Show("函数btn_Conn_Click出错:\n" + ex.Message.ToString()); } }*/ //发送 private void btn_FS_Click(object sender, EventArgs e) { try { ClientConnect(txb_ip.Text.Trim(), Convert.ToInt32(txb_port.Text.Trim())); if (tcp_client != null && tcp_client.Connected) { tcp_client.Close(); MessageAdd("客户端结束连接!"); } } catch (Exception ex) { MessageBox.Show("函数btn_FS_Click出错:\n" + ex.Message.ToString()); } } //关闭监听 private void CloseTCPListener() { if (tcp_listener != null) tcp_listener.Stop(); } //开始监听 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; CloseTCPListener(); } //退出程序 private void TCPFM_FormClosing(object sender, FormClosingEventArgs e) { CloseTCPListener(); if (tcp_listener != null) tcp_listener.Stop(); if (tcp_client != null) tcp_client.Close(); System.Environment.Exit(0);//Application.Exit(); } #endregion } }转载标明出处:https://blog.evanxia.com/2015/12/234