C# Socket通信的实现(同时监听多客户端)
作者:WizradMyL 发布时间:2023-07-11 09:25:10
标签: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);
}
}
//在粘贴代码时可能有漏'{'或'}'
补充:C# Socket的Listen监听方法
看代码~
_serverSocket.Listen(10);
public void Listen(int backlog);
Listen方法的整型参数表示的是:排队等待连接的最大数量,注意这个数量不包含已经连接的数量
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。
来源:https://blog.csdn.net/xunminwei0021/article/details/79065687


猜你喜欢
- 本文实例讲述了C#基于基姆拉尔森算法计算指定日期是星期几的方法。分享给大家供大家参考。具体分析如下:基姆拉尔森计算公式 W= (d+2*m+
- using System;using System.Data;using System.Data.OleDb;namespace ZFSof
- 使用java自带的Point类import java.awt.Point;//引用awt包下的Point类,此类的功能是表示 (x,y) 坐
- net 原则上禁止跨线程访问控件,因为这样可能造成错误的发生,推荐的解决方法是采用代理,用代理方法来间接操作不是同一线程创建的控件。第二种方
- 各个框架版本信息springboot: 2.1.3springcloud: Greenwich.RELEASEseata: 1.0.0sha
- 这篇文章主要介绍了Spring 事件Application Event原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定
- 本文实例讲述了C# linq查询之动态OrderBy用法。分享给大家供大家参考。具体分析如下:groupList是原始数据集合,List&l
- 概述在Winform中从后台添加控件相对比较容易,但是在WPF中,我们知道界面是通过XAML编写的,如何把后台写好的控件动态添加到前台呢?本
- 如何在冗长的监控录像中找到关键点?我们知道,监控录像中大部分信息都是没用的,那些信息就等同于一幅静态图像。我们要等待监控的范围内出现异常情况
- 使用RestTemplate时报错RestClientException这是自己封装的一个发送请求的方法public Map&l
- 前言:最近公司在项目开发中,由于华为手机存在部分的问题。所以购买了部分新款的华为手机。在真机调试项目APP时,老是无法出现Logcat打印出
- 最近在做Android 应用开发,IDE是android studio , 使用的版本配置如下:compileSdk 32bui
- 从相册或拍照更换图片功能的实现:(取图无裁剪功能)获取图片方式: (类似更换头像的效果)1、手机拍照 选择图片;2、相册选取图片;本文只是简
- 使用要点如下:1.利用ListAdapter(一般使用ArrayAdapter)为AutoCompleteTextView提供数据,若有需要
- 概述:开发过程中,看到有些界面用到一道光线在屏幕中掠过的效果,觉得挺炫的。所以查找相关资料自己实现了一遍。先上个预览图:实现思路:简单来说就
- 目录1、如果一个方法或变量是"private"访问级别,那么它的访问范围是:2、代码将打印?3、下面关于hibernat
- 1.使用List集合方式用list保存activity实例,然后逐一干掉import java.util.LinkedList;import
- 这篇会深化View拖拽实例,利用Flutter Animation、插值器以及AnimatedBuilder教大家实现带动画的抽屉效果。先来
- 1、效果2、简介本文主角是ItemTouchHelper。它是RecyclerView对于item交互处理的一个「辅助类」,主要用于拖拽以及
- 之前的一篇文章中的代码中有一个using的用法,刚开始查看了一些资料说是强制关闭对象的一个命令。今天又查了一些资料,才明白,原来using指