greyhh

记录学习中的点点滴滴
随笔 - 37, 文章 - 0, 评论 - 2, 阅读 - 76024

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

Socket通信

Posted on   greyhh  阅读(175)  评论(0编辑  收藏  举报

序言

Socket通信通用测试工具

 

代码

服务器类SocketServer.cs

 

复制代码
namespace SocketCom
{
    public class SocketServer
    {
        public string IP = "127.0.0.1";
        public int Port = 8088;
        public int MaxConnectCount = 10;
        public int ReceiveBufferSize = 1024;
        public Action<Socket, int, byte[]> MessageHandler;
        public int ConnectedCount { get { return clientSockets.Count; } }

        private byte[] receiveBuffer;
        private Socket serverSocket;
        private List<Socket> clientSockets;

        public SocketServer()
        {
            receiveBuffer = new byte[ReceiveBufferSize];
            clientSockets = new List<Socket>();
        }
        public SocketServer(string ip, int port, int maxCount = 10, int recSize = 1024)
        {
            this.IP = ip;
            this.Port = port;
            this.MaxConnectCount = maxCount;
            this.ReceiveBufferSize = recSize;
            receiveBuffer = new byte[ReceiveBufferSize];
            clientSockets = new List<Socket>();
        }
        public void Start()
        {
            IPAddress ip = IPAddress.Parse(IP);
            IPEndPoint ip_end_point = new IPEndPoint(ip, Port);
            serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            serverSocket.Bind(ip_end_point);
            serverSocket.Listen(MaxConnectCount);
            Thread thread = new Thread(ConnectServer);
            thread.Start();
            Console.WriteLine("服务器已启动!");
        }

        public void SendMessage(Socket socket, int mesType, byte[] data)
        {
            socket.Send(Common.WriteMessage(data,mesType));
        }
        public void SendMessageToAll(int mesType,byte[] data)
        {
            for (int i = 0; i < clientSockets.Count; i++)
            {
                if(clientSockets[i].Connected)
                clientSockets[i].Send(Common.WriteMessage(data, mesType));
            }
        }

        private void RecieveMessage(object clientSocket)
        {
            Socket mClientSocket = (Socket)clientSocket;
            while (true)
            {
                try
                {
                    int receiveNumber = mClientSocket.Receive(receiveBuffer);
                    ByteBuffer buff = new ByteBuffer(receiveBuffer);
                    int mesType = buff.ReadInt();
                    int len = buff.ReadInt();
                    byte[] data = buff.ReadBytes(len);
                    //Console.WriteLine("客户端发来消息:数据类型:{0} 数据长度:{1} 数据内容:{2}", mesType.ToString(), len, data);
                    if (MessageHandler != null)
                        MessageHandler(mClientSocket,mesType,data);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    mClientSocket.Shutdown(SocketShutdown.Both);
                    mClientSocket.Close();
                    break;
                }
            }
        }
        private void ConnectServer()
        {
            while (true)
            {
                Socket clientSocket = serverSocket.Accept();
                Console.WriteLine("客户端{0}成功连接", clientSocket.RemoteEndPoint.ToString());
                clientSockets.Add(clientSocket);
                string mes = "Connected To Server Successfully";
                clientSocket.Send(Common.WriteMessage(mes.ToBytes(),200));
                Thread thread = new Thread(RecieveMessage);
                thread.Start(clientSocket);
            }
        }  
    }
}
复制代码

 

客户端类SocketClient.cs

复制代码
namespace SocketCom
{
    public class SocketClient
    {
        public string IP = "127.0.0.1";
        public int Port = 8088;
        public int ReceiveBufferSize = 1024;
        public bool IsConnected = false;
        public Action<Socket, int, byte[]> MessageHandler;

        private byte[] receiveBuffer;
        private Socket clientSocket;

        public SocketClient()
        {
            receiveBuffer = new byte[ReceiveBufferSize];
        }
        public SocketClient(string ip, int port, int recSize = 1024)
        {
            this.IP = ip;
            this.Port = port;
            this.ReceiveBufferSize = recSize;
            receiveBuffer = new byte[ReceiveBufferSize];
        }
        public void Connect()
        {
            clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress mIp = IPAddress.Parse(IP);
            IPEndPoint ip_end_point = new IPEndPoint(mIp, Port);
            try
            {
                clientSocket.Connect(ip_end_point);
                IsConnected = true;
                Thread thread = new Thread(RecieveMessage);
                thread.Start(clientSocket);
                Console.WriteLine("连接服务器成功");
            }
            catch
            {
                IsConnected = false;
                Console.WriteLine("连接服务器失败");
                return;
            }
        }

        public void SendMessage(int mesType,string data="")
        {
            SendMessage(mesType,data.ToBytes());
        }
        public void SendMessage(int mesType,byte[] data)
        {
            if (IsConnected == false)
                return;
            try
            {
                clientSocket.Send(Common.WriteMessage(data, mesType));
            }
            catch
            {
                IsConnected = false;
                clientSocket.Shutdown(SocketShutdown.Both);
                clientSocket.Close();
            }
        }
        public void Close()
        {
            clientSocket.Shutdown(SocketShutdown.Both);
            clientSocket.Close();
        }
        private void RecieveMessage(object serverSocket)
        {
            Socket myServerSocket = (Socket)serverSocket;
            while (true)
            {
                try
                {
                    int receiveNumber = myServerSocket.Receive(receiveBuffer);
                    ByteBuffer buff = new ByteBuffer(receiveBuffer);
                    int mesType = buff.ReadInt();
                    int len = buff.ReadInt();
                    byte[] data = buff.ReadBytes(len);
                    //Console.WriteLine("服务器发来消息:数据类型:{0} 数据长度:{1} 数据内容:{2}", mesType.ToString(), len, data);
                    if (MessageHandler != null)
                        MessageHandler(myServerSocket, mesType,data);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    myServerSocket.Shutdown(SocketShutdown.Both);
                    myServerSocket.Close();
                    break;
                }
            }
        }
    }
}
复制代码

 

测试

只需简单配置一下,然后就可以专注于具体业务逻辑。

服务器

复制代码
       static void Main(string[] args)
        {
            SocketServer server = new SocketServer();
            server.IP = "127.0.0.1";
            server.Port = 9001;
            server.ReceiveBufferSize = 102400;
            server.MessageHandler += MessageHandle;
            server.Start();
            Console.ReadKey();
        }
复制代码

客户端

复制代码
       static void Main(string[] args)
        {
            SocketClient mSocketClient;
            mSocketClient = new SocketClient();
            mSocketClient.IP = "127.0.0.1";
            mSocketClient.Port = 9001;
            mSocketClient.ReceiveBufferSize = 102400;
            mSocketClient.MessageHandler += MessageHandle;
            mSocketClient.Connect();
        }
复制代码

测试处理函数

复制代码
private static void MessageHandle(Socket mySocket,int type, byte[] data)
        {
            if (type == (int)MessageType.Request)
                mySocket.SendMessage((int)MessageType.Data,"服务器接收到Request请求");
            if (type == (int)MessageType.Picture)
                mySocket.SendMessage((int)MessageType.Data, "服务器接收到图片请求");    
            if (type == (int)MessageType.Data)
                mySocket.SendMessage((int)MessageType.Data,"服务器接收到数据请求");
            if (type == (int)MessageType.Other)
                mySocket.SendMessage((int)MessageType.Data,"服务器接收到其他请求");
        }
复制代码

 

总结

服务器暂时没有处理客户端断开连接,后面会加一个心跳包来检测。

下载地址:https://github.com/jerryleeCP/SocketCom

 

编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示