客户端

    public class TcpClientHelper{/// <summary>/// 是否连接上/// </summary>public bool ConnectFlag { get; set; } = false;/// <summary>/// 监听的IP/// </summary>private string Ip { get; set; }/// <summary>/// 监听的端口/// </summary>private int Port { get; set; }/// <summary>/// 监听每次读取字节数/// </summary>private byte[] Buffer { get; set; }/// <summary>/// 连接套间字/// </summary>private Socket SocketC { get; set; }/// <summary>/// 监听线程/// </summary>private Thread ListenMsgTh { get; set; }/// <summary>/// 监听线程/// </summary>private Thread ReConnectTh { get; set; }/// <summary>/// 连接事件/// </summary>public event Action<string> SocketMessage;/// <summary>/// 接收消息/// </summary>public event Action<byte[], int> SocketReceive;/// <summary>/// 接收消息/// </summary>public event Action<byte[], int> SocketSend;/// <summary>/// 重连标志/// </summary>private bool ReConnnectFlag { get; set; } = false;/// <summary>/// 构造函数/// </summary>/// <param name="ip">连接服务器的IP</param>/// <param name="port">连接服务器的端口</param>public TcpClientHelper(string ip, int port, int bufferLength = 1024 * 1024){Ip = ip;Port = port;Buffer = new byte[bufferLength];}/// <summary>/// 初始化/// </summary>/// <param name="count">重连次数</param>/// <param name="delayTime">重连时间</param>public bool Init(){//连接if (!Connect())return false;//监听if (SocketC.Connected){ListenMsgTh = new Thread(receive);ListenMsgTh.IsBackground = true;ListenMsgTh.Start();}return true;}/// <summary>/// 连接/// </summary>/// <returns></returns>private bool Connect(){try{//1.0 实例化套接字(IP4寻址地址,流式传输,TCP协议)SocketC = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//2.0 创建IP对象IPAddress address = IPAddress.Parse(Ip);//3.0 创建网络端口包括ip和端口IPEndPoint endPoint = new IPEndPoint(address, Port);//4.0 建立连接SocketC.Connect(endPoint);//5.0 连接上服务端return ConnectFlag = true;}catch { }return ConnectFlag = false;}/// <summary>/// 重新连接/// </summary>public void ReConnect(SocketException ex){if (!ReConnnectFlag){SocketMessage?.Invoke("socket连接出错" + ex.Message + ex.StackTrace);//释放资源Close();//重连ReConnectTh = new Thread(delegate (){try{//循环重连for (; ; ){if (Connect()){break;}Thread.Sleep(10000);}SocketMessage?.Invoke("重连成功");//重新开启监听if (SocketC.Connected){ListenMsgTh = new Thread(receive){IsBackground = true};ListenMsgTh.Start();}//置位信号ReConnnectFlag = false;}catch (ThreadInterruptedException){ReConnnectFlag = false;}}){IsBackground = true};ReConnectTh.Start();}else{return;}}/// <summary>/// 发送数据/// </summary>/// <param name="buffer">字节数组数据</param>public void sendMessage(byte[] buffer){try{if (SocketC.Connected){SocketC.Send(buffer);}SocketSend?.Invoke(buffer, buffer.Length);}catch (SocketException ex){ReConnect(ex);}}/// <summary>/// 接收数据/// </summary>public void receive(){try{for (; ; ){//接收的字节数,当客户端下线时,receiveNumber=0int receiveNumber = SocketC.Receive(Buffer);//判断服务端是否下线,防止服务端下线时,客户端一直接收空消息if (receiveNumber == 0){throw new SocketException();}//接收事件SocketReceive?.Invoke(Buffer, receiveNumber);}}catch (SocketException ex){ReConnect(ex);}catch (ThreadInterruptedException){ }}/// <summary>/// 释放所有套间字/// </summary>public void Close(){ReConnnectFlag = true;ConnectFlag = false;//中断线程if (ListenMsgTh != null && ListenMsgTh.IsAlive){ListenMsgTh.Interrupt();}if (ReConnectTh != null && ReConnectTh.IsAlive){ReConnectTh.Interrupt();}//关闭连接if (SocketC.Connected){SocketC.Shutdown(SocketShutdown.Both);SocketC.Close();}}/// <summary>/// 析构函数/// </summary>~TcpClientHelper(){Close();}}

服务端

/// <summary>/// TCP服务端/// </summary>public class TcpServerHelper : IDisposable{/// <summary>/// 监听套间字/// </summary>private Socket SocketS { get; set; }/// <summary>/// 连接池数列/// </summary>private List<Socket> SocketClients { get; set; }/// <summary>/// 连接数/// </summary>public int ConnectCount { get { return SocketClients.Count; } }/// <summary>/// 是否监听/// </summary>public bool isListening { get { return SocketS.IsBound; } }/// <summary>/// 监听的IP/// </summary>private string Ip { get; set; }/// <summary>/// 监听的端口/// </summary>private int Port { get; set; }/// <summary>/// 监听每次读取字节数/// </summary>private byte[] Buffer { get; set; }/// <summary>/// 最大连接数/// </summary>private int Count { get; set; }/// <summary>/// 接收消息/// </summary>public event Action<byte[], int, EndPoint> SocketReceive;/// <summary>/// 报错事件/// </summary>public event Action<string, Exception, EndPoint> SocketMessage;/// <summary>/// 连接事件/// </summary>public event Action<bool, EndPoint> ConnectEndPoints;/// <summary>/// /// <summary>/// 构造函数/// </summary>/// <param name="ip">监听的IP</param>/// <param name="port">监听的端口</param>/// <param name="bufferLength">监听每次读取字节数,默认1MB = 1024 * 1024B</param>public TcpServerHelper(string ip, int port, int bufferLength = 1024 * 1024, int count = int.MaxValue){Ip = ip;Port = port;Buffer = new byte[bufferLength];SocketClients = new List<Socket>();Count = count;}/// <summary>/// 开始监听/// </summary>/// <returns></returns>public async Task Listen(){try{//1.0 实例化套接字(IP4寻找协议,流式协议,TCP协议)SocketS = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//2.0 创建IP对象IPAddress address = IPAddress.Parse(Ip);//3.0 创建网络端口,包括ip和端口IPEndPoint endPoint = new IPEndPoint(address, Port);//4.0 绑定套接字SocketS.Bind(endPoint);//5.0 设置最大连接数SocketS.Listen(Count);//6.0 循环遍历连接await Task.Run(() =>{for (; ; ){try{//接收客户端连接Socket SocketClient = SocketS.Accept();//加入连接池数列SocketClients.Add(SocketClient);//连接事件SocketMessage?.Invoke($"{SocketClient.RemoteEndPoint}接入", null, SocketClient.RemoteEndPoint);ConnectEndPoints?.Invoke(true, SocketClient.RemoteEndPoint);//开始监听Thread thread = new Thread(Receive);thread.Start(SocketClient);}catch (SocketException ex){SocketMessage?.Invoke("服务监听出错", ex, null);}catch (Exception ex){LogHelper.GetInstance().WriteLogEx(ex);}}});}catch (Exception ex){SocketMessage?.Invoke("服务监听出错", ex, null);}}/// <summary>/// 发送数据/// </summary>/// <param name="buffer"></param>/// <returns></returns>public void Send(byte[] buffer){for (int index = SocketClients.Count - 1; index >= 0; index--){try{SocketClients[index].Send(buffer);}catch (SocketException ex){CloseConnect(SocketClients[index], ex);}}}/// <summary>/// 接收消息/// </summary>/// <param name="socket">来自客户端的socket</param>private void Receive(object SocketClient){Socket socketClient = (Socket)SocketClient;try{for (; ; ){//接收的字节数,当客户端下线时,receiveNumber=0int receiveNumber = socketClient.Receive(Buffer);//判断客户端是否下线,防止客户端下线时,服务端一直接收空消息if (receiveNumber == 0){throw new SocketException();}//接收成功事件SocketReceive(Buffer, receiveNumber, socketClient.RemoteEndPoint);}}catch (SocketException ex){CloseConnect(socketClient, ex);}catch (Exception){}}/// <summary>/// 断开连接/// </summary>/// <param name="socket"></param>/// <param name="ex"></param>private void CloseConnect(Socket socket, SocketException ex){SocketMessage?.Invoke($"{socket.RemoteEndPoint}断开连接", ex, socket.RemoteEndPoint);ConnectEndPoints?.Invoke(false, socket.RemoteEndPoint);socket.Close();SocketClients.Remove(socket);}/// <summary>/// 释放所有套间字/// </summary>public void Dispose(){try{SocketS.Close();foreach (Socket socket in SocketClients){socket.Close();}}catch{ }}/// <summary>/// 析构函数/// </summary>~TcpServerHelper(){Dispose();}}

.NET TCP服务端和客户端相关推荐

  1. Qt:Qt实现Winsock网络编程—TCP服务端和客户端通信(多线程)

    Qt实现Winsock网络编程-TCP服务端和客户端通信(多线程) 前言 感觉Winsock网络编程的api其实和Linux下网络编程的api非常像,其实和其他编程语言的网络编程都差不太多.博主用Qt ...

  2. 2-3 建立简易TCP服务端、客户端【socket server/client】【socket、bind、listen、accept、send、closesocket】【conect、recv】

    2-3 建立简易TCP服务端.客户端 文章目录 2-3 建立简易TCP服务端.客户端 0-前言 1-服务端简易功能 2-客户端简易功能 3-代码逻辑 4-服务端 4-1 建立socket 4-2 绑定 ...

  3. Go语言实现TCP服务端和客户端

    Go语言实现TCP服务端和客户端 Go语言实现TCP通信 TCP协议 TCP服务端 TCP客户端 本文转载自Go语言实现TCP通信 Go语言实现TCP通信 TCP协议 TCP/IP(Transmiss ...

  4. windows Socket编程之TCP服务端与客户端

    在前面的文章中有一篇讲到了命名管道通信,它是创建一根管道来进行进程之间或网络之间通信的.但是它有些缺陷,比如说效率较低等.而从这篇文章开始将介绍socket编程.socket是通过TCP,UDP,IP ...

  5. java BIO tcp服务端向客户端消息群发代码教程实战

    前言 项目需要和第三方厂商的服务需要用TCP协议通讯,考虑到彼此双方可能都会有断网重连.宕机重启的情况,需要保证 发生上述情况后,服务之间能够自动实现重新通信.研究测试之后整理如下代码实现.因为发现客 ...

  6. JAVA NIO 异步TCP服务端向客户端消息群发代码教程实战

    前言 项目需要和第三方厂商的服务需要用TCP协议通讯,考虑到彼此双方可能都会有断网重连.宕机重启的情况,需要保证 发生上述情况后,服务之间能够自动实现重新通信.研究测试之后整理如下代码实现.因为发现客 ...

  7. python学习随堂笔记—TCP服务端与客户端

    思想: 1. 客户端 向服务端 发起连接 2. 服务端 接到请求,双方建立连接 3. 客户端 向 服务端发消息 4. 服务端 应答客户端 5. 服务端 与客户端循环读写操作 6. 操作完成之后客户端发 ...

  8. php编写TCP服务端和客户端程序

    From: http://blog.csdn.net/anda0109/article/details/46655301 1.修改php.ini,打开extension=php_sockets.dll ...

  9. node.js中net网络模块TCP服务端与客户端的使用

    node.js中net模块为我们提供了TCP服务器和客户端通信的各种接口. 一.创建服务器并监听端口 const net = require('net');//创建一个tcp服务 //参数一表示创建服 ...

最新文章

  1. MySQL-主从架构的搭建
  2. Oracle的in查询
  3. 粒子群优化算法(Particle Swarm Optimization)的 Matlab(R2018b)代码实现
  4. android 版本更新工具类_报表分析工具FastReport .Net 2021年超大版本更新,实现了对.NET 5的支持...
  5. homebrew 安装 mpv
  6. Java Swing事件处理——行为事件及监听处理 ActionListener和内部类
  7. FileZilla 无法连接服务器 fzSftp started, protocol_version=11
  8. Python 使用Gmail发送邮件
  9. XMind使用教程入门
  10. 信息规范和信息安全素养计算机,技师学院计算机专业学生信息安全意识培养的教学研究...
  11. 云原生GIS技术全解读
  12. BIOS硬盘模式更改为AHCI模式,及更改后win10蓝屏的解决办法
  13. java jdk7.0安装包_jdk7下载|java jdk 1.7下载 安装包 - 跑跑车手游网
  14. KD2684S绕组匝间故障检测仪
  15. MATLAB 绘制时钟(同步当前时间)
  16. javaweb学生签到考勤请假系统
  17. Eclipse,JKD,JRE
  18. 弦截法求方程根例题c语言,弦截法求方程根.ppt
  19. 怎么输出链表最后一个元素_听说AI将是人类最后一个发明?听听他怎么说!
  20. 那些好玩的网站(二)

热门文章

  1. 调制解调器拨号失败服务器无响应,解决调制解调器的一般问题
  2. 同济、阿里的CVPR 2022最佳学生论文奖研究了什么?这是一作的解读
  3. Succeeding with Object databases: a practical look at today's implementations with Java and XML
  4. 根据ip获取地址和运营商
  5. 使用百度大脑EasyDL创建吸烟监控模型
  6. 【TencentOS tiny学习】源码分析(2)——调度器
  7. Keepalived+NFS+DRBD
  8. post表单时的html报文的header信息
  9. linux rndis usb网络,RNDIS介绍
  10. vue-simple-uploader实现多文件/文件夹以及可拖拽上传