C#实现Socket通信(同时监听多客户端)

 //创建socket对象
            //第一个参数:设置网络寻址的协议、第二参数设置数据传输的方式、第三个参数设置通信协议
            Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //2.绑定IP端口
            string str = "127.0.0.1";
            int ports = 55555;
            IPAddress ip = IPAddress.Parse(str);
            IPEndPoint ipENdpoint = new IPEndPoint(ip, ports);

            serverSocket.Bind(ipENdpoint);
            //3.开启监听
            serverSocket.Listen(10);
            label5_Timer.Text = "开始监听···";

            //4.开始接受客户端的链接
            ThreadPool.QueueUserWorkItem(new WaitCallback(this.StartAcceptClient), serverSocket);


        }
        public void StartAcceptClient(object state)
        {
            var serverSocket = (Socket)state;
            this.AppendTextLog("服务器开始接受客户端的链接");
            while (true)
            {
                try
                {
                    Socket prosock = serverSocket.Accept();
                    //将远程链接的客户端的IP地址和socket存入集合中
                    dicSocket.Add(prosock.RemoteEndPoint.ToString(), prosock);
                    string ipPort = prosock.RemoteEndPoint.ToString();
                    MedicineDevice ns = new MedicineDevice();
                    SQLMachine j = new SQLMachine();
                   

                    j.MedicineDeviceStatus(ipPort, "在线");
                    //链接对象的信息
                    string stinfo = prosock.RemoteEndPoint.ToString();
                    this.AppendTextLog(string.Format("客户端{0}链接上了", stinfo));

                    ClientProSocketList.Add(prosock);
                    //服务器接收客户端的消息
                    ThreadPool.QueueUserWorkItem(new WaitCallback(this.ReceiveData), prosock);
                }
                catch (Exception e)
                {
                    return;
                    //throw;
                }


            }
 public void ReceiveData(object obj)
        {
            var prosock = (Socket)obj;
            byte[] data = new byte[1024 * 1024];
            //方法返回代表实际接受的数据的长度
            while (true)
            {
                int realen = 0;
                try
                {
                    realen = prosock.Receive(data, 0, data.Length, SocketFlags.None);
                }
                catch (Exception e)
                {
                    //异常退出
                    AppendTextLog(string.Format("设备 {0} 异常退出", prosock.RemoteEndPoint.ToString()));                  
                    StopCOnnecte(prosock);
                    return;
                }
                if (realen <= 0)
                {
                    //对方正常退出

                    AppendTextLog(string.Format("设备 {0} 正常退出:", prosock.RemoteEndPoint.ToString()));
                
                      
                    }
                    prosock.Shutdown(SocketShutdown.Both);
                    prosock.Close();
                    ClientProSocketList.Remove(prosock);
                    return;
                }
                //接受到的数据
                string fromClientMsg = Encoding.Default.GetString(data, 0, realen);
                AppendTextLog(string.Format("接收到 {0} 的消息是:{1}", prosock.RemoteEndPoint.ToString(), fromClientMsg));}}
  private void StopCOnnecte(Socket prosock)
        {
            try
            {
                if (prosock.Connected)
                {
                    prosock.Shutdown(SocketShutdown.Both);
                    prosock.Close(100);
                }
            }
            catch (Exception ex)
            {

            }
        }

 public void AppendTextLog(string txt)
        {
            if (textBox_Message.InvokeRequired)
            {
                textBox_Message.BeginInvoke(new Action<string>(s =>
                {
                    this.textBox_Message.Text = string.Format("{0}\r\n{1}", s, textBox_Message.Text);
                }
                    ), txt);
                //同步方法
                //textBox_Message.Invoke(new Action<string>(s =>
                //    {
                //        this.textBox_Message.Text = string.Format("{0}\r\n{1}", s, textBox_Message.Text);
                //    }
                //    ), txt);
            }
            else
            {
                this.textBox_Message.Text = string.Format("{0}\r\n{1}", txt, textBox_Message.Text);
            }
        }
//在粘贴代码时可能有漏'{'或'}'


  • 1
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
C#中,可以使用System.Net.Sockets命名空间中的类来实现Socket通信。以下是一个简单的示例来说明如何在C#实现Socket通信: 1. 首先,需要使用`Socket`类来创建服务器端和客户端Socket对象。可以使用`SocketType.Stream`来创建一个基于TCP协议的Socket对象。 2. 服务器端需要使用`Socket.Bind`方法将Socket对象绑定到一个IP地址和端口号上。这样,服务器端就可以监听指定的地址和端口,等待客户端的连接。 3. 启动服务器端的监听,并使用`Socket.Accept`方法接受客户端的连接。一旦有客户端连接成功,服务器端会返回一个新的Socket对象,用于与该客户端进行通信。 4. 客户端需要使用`Socket.Connect`方法连接到服务器端指定的地址和端口。一旦连接成功,客户端就可以与服务器端进行通信。 5. 在服务器端和客户端之间可以使用`Socket.Send`方法和`Socket.Receive`方法来发送和接收数据。可以将数据转换为字节数组进行传输。 6. 当通信完成后,需要使用`Socket.Close`方法关闭Socket对象。 下面是一个简单的C#代码示例,演示了服务器端和客户端之间的Socket通信: ```csharp // 服务器端 Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); serverSocket.Bind(new IPEndPoint(IPAddress.Any, 8080)); serverSocket.Listen(10); Console.WriteLine("Waiting for client connection..."); Socket clientSocket = serverSocket.Accept(); Console.WriteLine("Client connected."); byte[] buffer = new byte

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

It&code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值