Unity网络开发记录(二):采用多线程处理服务端对客户端的连接和信息处理

在主线程处理对所有客户端的连接以及消息处理,是非常消耗时间的,所以对于监听客户端的连接,以及信息的接收,都额外开线程去处理,减轻主线程的压力

cs 复制代码
using System.Globalization;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace TechTcpServerTest
{
    internal class Program
    {
        static Socket socket;
        static Socket socketClient;
        static List<Socket> socketClients = new List<Socket>();
        static void Main(string[] args)
        {
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try
            {
                IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080);
                socket.Bind(ipPoint);
            }
            catch (Exception)
            {
                return;                
            }
            socket.Listen(1024);

            Thread threadAccept = new Thread(AcceptClientConnect);
            threadAccept.Start();

            Thread threadResive = new Thread(ReceiveMsg);
            threadAccept.Start();

            while(true)
            {
                if (Console.ReadLine() != "Quit")
                {
                    return;
                }

                for(int i = 0; i < socketClients.Count; ++i)
                {
                    socketClients[i].Shutdown(SocketShutdown.Both);
                    socketClients[i].Close();
                }
                socketClients.Clear();
                Console.WriteLine("所有连接已断开,socket套接字关闭");
                break;
            }
            Console.ReadLine();
        }
        
        static void AcceptClientConnect()
        {
            while (true)
            {
                socketClient = socket.Accept();
                socketClients.Add(socketClient);
                if (socketClient.RemoteEndPoint != null)
                {
                    socketClient.Send(Encoding.UTF8.GetBytes($"{socketClient.RemoteEndPoint.ToString()}客户端已成功连接服务器"));
                }
            }
        }

        static void ReceiveMsg()
        {
            int i;
            int num;
            byte[] receiveBuffer = new byte[1024];
            while(true)
            {
                for(i = 0; i < socketClients.Count; ++i)
                {
                    if (socketClients[i].Available > 0)
                    {
                        num = socketClients[i].Receive(receiveBuffer);
                        ThreadPool.QueueUserWorkItem(HandleMsg, (socketClients[i], Encoding.UTF8.GetString(receiveBuffer, 0, num)));
                    }
                }
            }
        }

        static void HandleMsg(object obj)
        {
            (Socket s, string str)info = ((Socket s, string str))obj;
            if (info.s.RemoteEndPoint != null)
            {
                Console.WriteLine($"收到来次{info.s.RemoteEndPoint.ToString()}的消息:{info.str}");
            }
        }

    }
}

启动服务端,在unity中启动客户端,客户端最基本的代码在上一节,发现依旧可以正常连接,本节处理完毕

相关推荐
qq_401700417 小时前
TCP 粘包问题深度解析:嵌入式网络开发的常见坑与解决方案
服务器·网络·qt·网络协议·tcp/ip
zhao3266857517 小时前
长效静态IP与短效动态IP怎么选?两种适用场景有何区别
大数据·网络·tcp/ip
2601_949499948 小时前
芯瑞科技 DT‑1414完全兼容HFBR‑1414TZ光模块国产化优选方案深度解析(工程师视角)
运维·网络·人工智能·科技·光模块
XUEYUAN52128 小时前
代理日志分析与监控:代理池健康状态巡检与分级告警体系搭建(运维实战)
运维·网络·网络协议·tcp/ip·算法·架构
Fcy6488 小时前
Linux下 Socket编程 —— UDP网络编程
linux·网络·udp
酒神dnspup9 小时前
服务器端口检测怎么做?用 DNSPup 核对开放端口、监听服务与暴露风险
网络·网络协议·http·ssl证书·http状态码·服务器端口
2301_800895109 小时前
计算机组成原理保研面试题目整理---h
网络
酒神dnspup9 小时前
HTTP状态码检测怎么做?用 DNSPup 排查 4xx、5xx、重定向与网站可用性
网络·网络协议·http·http状态码
数据知道10 小时前
白盒审计入门:Source Code Review 检查清单
网络·安全·网络安全·代码复审
CDN36010 小时前
IP 黑白名单防护实操:出海网站拦截恶意爬虫、扫描 IP,CDN 流量管控落地指南
网络·爬虫·tcp/ip