C# Socket异步通信demo,一个服务器对应多个客户端

来源:互联网 发布:json与javascript 编辑:程序博客网 时间:2024/05/18 22:41

最近做了个客户端和服务器通信的小程序,按照惯例,下面是程序界面,可以看到现在开了两个客户端,一个是127.0.0.1:2026,另一个是127.0.0.1:2030。源码服务listen可以自定义客户端数。demo下载通道http://download.csdn.net/detail/wuma0q1an/9478564




之前看到别人类似的程序,服务端和客户端采用相同的回调函数,可以是可以。但是服务端就不能接受到多个客户端的信息了,所以在demo里面改良了下

        /// <summary>        /// 连接到客户端        /// </summary>        /// <param name="socket"></param>        private void AsyncAccept(object socket)        {            Socket thissocket = (Socket)socket;            thissocket.BeginAccept(asyncResult =>            {                    //获取客户端套接字                    Socket client = thissocket.EndAccept(asyncResult);                    ReceiveMessage(client);            }, null);        }

下面是一些关键代码,当然你比较懒的话可以去下载我的demohttp://download.csdn.net/detail/wuma0q1an/9478564

1.开始监听

    public void Start()        {            IPAddress ip = IPAddress.Parse(txtIp.Text.ToString());            myProt = int.Parse(txtPort.Text.Trim());            serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            serverSocket.Bind(new IPEndPoint(ip, myProt));            serverSocket.Listen(100);            UpdateTxtMethod(string.Format("已启动服务器,启动监听{0}成功", serverSocket.LocalEndPoint.ToString()));            myThread = new Thread(ListenClientConnect);            myThread.Start();        }
2.监听线程

       /// <summary>          /// 监听客户端连接          /// </summary>          private void ListenClientConnect()        {            while (true)            {                Socket clientSocket = serverSocket.Accept();                Thread receiveThread = new Thread(ReceiveMessage);                receiveThread.Start(clientSocket);            }        }

3.收到信息处理

 private void ReceiveMessage(object clientSocket)        {            Socket myClientSocket = (Socket)clientSocket;            while (!myClientSocket.Poll(10, SelectMode.SelectRead))            {                try                {                    var buffer = new byte[1024];//设置一个缓冲区,用来保存数                    myClientSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback((ar) =>                    {                        try                        {                            var length = myClientSocket.EndReceive(ar);                            //读取出来消息内容                            var message = Encoding.ASCII.GetString(buffer, 0, length);                            if (message.Trim() != "" && message != null)                            {                                updateTxt = new UpdateTxt(UpdateTxtMethod);                                this.BeginInvoke(updateTxt, string.Format("接收客户端{0}消息:{1}", myClientSocket.RemoteEndPoint.ToString(), message));                            }                        }                        catch                        {                        }                    }), null);                }                catch (Exception ex)                {                    Console.WriteLine(ex.Message);                    myClientSocket.Shutdown(SocketShutdown.Both);                    myClientSocket.Close();                    break;                }            }        }

所以,整个流程大概如上~

0 1
原创粉丝点击