C#简单实现实现TCP服务器多线程数据接收

    技术2026-08-29  7

    1、引入依赖库,无需第三方。

    using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Windows.Forms;

    2、变量声明

    /// <summary> /// 缓冲器 /// </summary> private byte[] result = new byte[1024]; /// <summary> /// 最大连接数 /// </summary> private int maxClientCount; /// <summary> /// 服务IP地址 /// </summary> private string ip; /// <summary> /// 服务端口号 /// </summary> private int port; // 编码 // private string code; /// <summary> /// 客户端列表 /// </summary> private List<Socket> ClientSockets; /// <summary> /// IP终端 /// </summary> private IPEndPoint ipEndPoint; /// <summary> /// 服务端Socket /// </summary> private Socket ServerSocket; /// <summary> /// 当前客户端Socket /// </summary> private Socket ClientSocket;

    3、开启TCP服务

    ip = IPAddress.Any.ToString(); //服务于任意IP地址 port=8640;//服务端口,理论自定义范围 1-65535,不可与以开放端口冲突 maxClientCount = 256; //设定最大连接数 ClientSockets = new List<Socket>(); ipEndPoint = new IPEndPoint(IPAddress.Any, port); //初始化IP终端 ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //初始化服务端Socket ServerSocket.Bind(this.ipEndPoint); //端口绑定 ServerSocket.Listen(maxClientCount); //设置监听数目 Thread ServerThread = new Thread(() => { ListenClientConnect(); //开启监听,后台线程,非阻塞 }) { IsBackground = true, }; ServerThread.Start();//服务端线程开启

    4、TCP连接侦听

    /// <summary> /// 后台线程侦听连接 /// </summary> private void ListenClientConnect() { //设置循环标志位 while (true) { try { //获取连接到服务端的客户端 ClientSocket = ServerSocket.Accept(); //将获取到的客户端添加到客户端列表 ClientSockets.Add(ClientSocket); //显示连接者信息 //Show_msg($@"客户端接入:{ClientSocket.RemoteEndPoint}"); //创建客户端消息线程,实现客户端消息的循环监听 Thread ReveiveThread = new Thread(() => { ReceiveClient(ClientSocket); //数据接收 }) { IsBackground = true, }; ReveiveThread.Start(); } catch (Exception ex) { //Show_msg($@"连接侦听异常:{ex.Message}"); } } }

    5、数据接收

    /// <summary> /// 后台线程接收数据 /// </summary> /// <param name="obj"></param> private void ReceiveClient(object obj) { Socket _ClientSocket = (Socket)obj; while (true) { try { //获取数据长度 int receiveLength = _ClientSocket.Receive(result); //获取客户端发来的数据 string strData = Encoding.UTF8.GetString(result, 0, receiveLength); //Show_msg($@"客户端{_ClientSocket.RemoteEndPoint}】 发来数据:{strData}"); /* 对接收到的数据进行处理 */ //向客户端回发数据 //_ClientSocket.Send(Encoding.UTF8.GetBytes($@"我已收到您发来的数据{strData }")); } catch (Exception e)//通讯出现异常 { //从客户端列表中移除该客户端 this.ClientSockets.Remove(_ClientSocket); //断开连接 //Show_msg($@"客户端{_ClientSocket.RemoteEndPoint}从服务器断开,断开原因:{e.Message}"); _ClientSocket.Shutdown(SocketShutdown.Both); _ClientSocket.Close(); break; } } }
    Processed: 0.009, SQL: 9