ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

C# WinForm UDP Socket聊天室

C# WinForm UDP Socket聊天室 一、UDP 与 TCP 核心区别必考简答题1.1 核心理论知识点TCP面向连接、可靠传输、流式数据、三次握手、需Accept建立连接UDP无连接、不可靠传输、数据报模式、无需握手、无需建立连接、直接收发数据UDP核心方法ReceiveFrom / SendTo自带终端地址TCP核心方法Accept / Receive / Send基于已建立连接1.2 UDP套接字固定三参数考点代码UDP固定参数IPv4 数据报模式 UDP协议// UDP专属创建代码 new Socket(AddressFamily.InterNetwork, // IPv4 SocketType.Dgram, // 数据报UDP核心标识 ProtocolType.Udp); // UDP协议二、UDP服务端完整流程知识点逐段代码2.1 全局变量定义知识点UDP无需保存Socket客户端对象只需保存客户端终端地址字符串IP端口Socket server; CancellationTokenSource cts; // 存储所有在线客户端终端地址 IP:Port ListString clients new ListString();2.2 启动UDP服务器流程知识点代码UDP服务端流程创建Socket → Bind绑定端口 → 直接监听数据无需Listen、无需Acceptif (button1.Text 启动UDP服务器) { // 1.创建UDP数据报套接字 server new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp); // 2.绑定固定IP和端口 server.Bind(new IPEndPoint(IPAddress.Parse(192.168.219.38),99997)); // 3.开启循环接收数据 AcceptData(); button1.Text 停止UDP服务器; }2.3 关闭UDP服务器逻辑知识点代码UDP无连接关闭只需释放Socket、清空客户端列表、重置状态else { server.Close(); server null; clients.Clear(); button1.Text 启动UDP服务器; }2.4 UDP核心接收方法 ReceiveFrom超级重点知识点UDP无连接接收数据时自动获取发送方终端地址ref EndPoint 传出客户端地址byte[] buffer new byte[server.Available]; // 初始化任意终端用于接收发送方真实地址 EndPoint endPoint new IPEndPoint(IPAddress.Any,0); // 核心方法接收数据 获取客户端终端 server.ReceiveFrom(buffer, ref endPoint);2.5 客户端在线列表去重逻辑知识点代码知识点UDP无连接客户端反复发数据会重复记录需先去重再添加// 根据终端地址去重 int indexclients.FindIndex(ccendPoint.ToString()); if (index ! -1) { clients.RemoveAt(index); } clients.Add(endPoint.ToString());2.6 跨线程UI刷新必考子线程不能操作UI控件必须使用 Invoke 回调主线程刷新在线列表、聊天记录Invoke(new Action(() { comboBox1.DataSource null; comboBox1.DataSource clients; string msgEncoding.UTF8.GetString(buffer); richTextBox1.Text ${endPoint.ToString()}::{msg}{Environment.NewLine}; }));三、UDP服务端双发送模式私聊群发知识点代码3.1 UDP发送核心方法 SendTo知识点UDP发送必须指定目标终端EndPoint无默认连接对象3.2 群发模式遍历所有客户端if (checkBox1.Checked) { foreach (var item in clients) { // 拆分字符串 IP:Port string ipitem.Split(:)[0]; string portitem.Split(:)[1]; EndPoint pointnew IPEndPoint(IPAddress.Parse(ip),int.Parse(port)); // 群发数据 server.SendTo(Encoding.UTF8.GetBytes(textBox3.Text),point); } }3.3 私聊模式选中指定客户端else { string s comboBox1.SelectedItem.ToString(); string ip s.Split(:)[0]; string port s.Split(:)[1]; EndPoint point new IPEndPoint(IPAddress.Parse(ip), int.Parse(port)); // 私发指定客户端 server.SendTo(Encoding.UTF8.GetBytes(textBox3.Text),point); }四、UDP客户端全套知识点逐段代码4.1 客户端全局变量;Socket client; // 固定服务端终端地址 EndPoint endPoint; CancellationTokenSource cts;4.2 客户端初始化无需连接知识点UDP客户端无需Connect连接直接创建Socket、绑定服务端地址即可通信private void Form1_Load(object sender, EventArgs e) { try { // 指定服务端IP和端口 endPoint new IPEndPoint(IPAddress.Parse(192.168.219.38),9999); // 创建UDP客户端套接字 clientnew Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp); // 开启接收监听 AccecpData(); } catch (Exception) { Console.WriteLine(); } }4.3 客户端接收数据private void AccecpData() { ctsnew CancellationTokenSource(); Task.Run(() { while (!cts.IsCancellationRequested) { if (client.Available 0) continue; byte[] buffer new byte[client.Available]; EndPoint end new IPEndPoint(IPAddress.Any, 0); // 接收服务端数据获取发送方终端 client.ReceiveFrom(buffer, ref end); Invoke(new Action(() { richTextBox1.Text ${end.ToString()}:{Encoding.UTF8.GetString(buffer)}{Environment.NewLine}; })); } }, cts.Token); }4.4 客户端两种发送方式方式1直接发给固定服务端private void button1_Click(object sender, EventArgs e) { // 直接向预设服务端终端发送数据 client.SendTo(Encoding.UTF8.GetBytes(textBox1.Text),endPoint); }方式2自定义目标IP端口发送自由点对点private void button2_Click(object sender, EventArgs e) { string stextBox2.Text; string ips.Split(:)[0]; string ports.Split(:)[1]; client.SendTo(Encoding.UTF8.GetBytes(textBox2.Text), new IPEndPoint(IPAddress.Parse(ip), int.Parse(port))); }五、UDP高频考点易错点总结5.1 UDP独有考点UDP无连接没有Listen、Accept、Connect步骤核心方法ReceiveFrom、SendTo必须携带终端地址服务端不需要保存客户端Socket只保存 IP:Port 字符串支持任意点对点通信不限制服务端客户端模式5.2 UDP与TCP最大区别考试默写TCP面向连接、可靠、流式传输UDP无连接、不可靠、数据报传输TCP需要先建立连接UDP直接收发数据TCP用Receive/SendUDP用ReceiveFrom/SendToTCP可以精准识别客户端下线UDP无法感知断线只能去重刷新列表5.3 易错踩坑点UDP必须用SocketType.Dgram不能写Stream接收数据必须传入ref EndPoint否则无法获取发送方地址UDP客户端无需Connect写Connect直接报错子线程更新UI必须Invoke否则程序闪退客户端重复上线需要先删后加去重六、UDP聊天室简答题满分模版本项目基于UDP数据报协议实现聊天室功能UDP属于无连接、不可靠传输协议无需建立连接即可直接收发数据。服务端通过Dgram类型Socket绑定固定端口使用ReceiveFrom方法接收客户端数据并自动获取客户端终端地址通过集合去重维护在线客户端列表。支持客户端私聊与全员群发两种消息模式通过SendTo方法指定目标终端完成数据转发。客户端无需连接服务端直接指定服务端IP端口即可通信全程异步线程接收数据通过Invoke完成跨线程UI更新实现简易UDP多人聊天室通信。
返回列表