C#の簡単実装でTCPサーバーのマルチスレッドデータ受信を実現

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;
		}
	}
}

おすすめ

転載: blog.csdn.net/lzl640/article/details/107134160
おすすめ