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

作者:WizradMyL 时间:2023-07-11 09:25:10 

看代码~


//创建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);
           }
       }
//在粘贴代码时可能有漏'{'或'}'

补充:C# Socket的Listen监听方法

看代码~


_serverSocket.Listen(10);
 public void Listen(int backlog);

Listen方法的整型参数表示的是:排队等待连接的最大数量,注意这个数量不包含已经连接的数量

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

来源:https://blog.csdn.net/xunminwei0021/article/details/79065687

标签:C#,Socket,监听,客户端
0
投稿

猜你喜欢

  • C# dynamic关键字的使用方法

    2023-02-26 08:40:01
  • Spring Boot整合JWT的实现步骤

    2022-07-17 04:48:58
  • Android结束进程的方法详解

    2023-06-09 20:27:30
  • Java文件上传下载、邮件收发实例代码

    2022-07-05 06:40:00
  • SpringBoot整合之SpringBoot整合MongoDB的详细步骤

    2023-11-25 09:55:37
  • maven将项目打包上传到nexus私服的详细教程

    2023-04-18 16:20:22
  • docker 的java编译环境构建详细介绍

    2023-02-10 04:08:30
  • Android自定义控件ListView下拉刷新的代码

    2023-04-07 23:51:06
  • c#读取文件详谈

    2023-03-04 14:47:30
  • Java基于分治算法实现的棋盘覆盖问题示例

    2021-07-17 14:05:16
  • 浅谈Spring中@NotEmpty、@NotBlank、@NotNull区别

    2023-01-02 08:15:49
  • Java集合TreeSet用法详解

    2023-11-10 22:53:34
  • 修改Android签名证书keystore的密码、别名alias以及别名密码

    2022-03-07 04:22:42
  • Android中Button实现点击换图案及颜色

    2022-06-28 00:42:10
  • C#生成随机数实例

    2023-09-17 23:28:28
  • java 创建线程的几种方式

    2023-10-29 19:40:16
  • 详解在Spring3中使用注解(@Scheduled)创建计划任务

    2022-11-14 15:39:34
  • Android 区别真机和模拟器的几种方法

    2022-05-19 14:13:44
  • Java Web开发之基于Session的购物商店实现方法

    2023-06-09 20:46:35
  • C#生成putty格式的ppk文件

    2021-10-12 10:39:50
  • asp之家 软件编程 m.aspxhome.com