首页 > 编程语言 >C# 处理TCP数据的类(服务端)

C# 处理TCP数据的类(服务端)

时间:2022-08-29 12:55:38浏览次数:57  
标签:tcpClient C# System TCP int using new 服务端

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Net;
  4 using System.Net.Sockets;
  5 using System.Text;
  6 using System.Threading;
  7 
  8 namespace TestDemo
  9 {
 10     /// <summary>
 11     /// 处理TCP数据的类
 12     /// </summary>
 13     public class TcpService
 14     {
 15         /// <summary>
 16         /// TCP监听对象
 17         /// </summary>
 18         private TcpListener listener;
 19 
 20         /// <summary>
 21         /// 创建TCP监听
 22         /// </summary>
 23         public void CreateListener()
 24         {
 25             try
 26             {
 27                 // 监听对象
 28                 listener = new TcpListener(IPAddress.Any, API.TcpPort);
 29                 listener.Start();
 30                 // 独立线程监听
 31                 Thread thread = new Thread(StartListener);
 32                 thread.Start();
 33             }
 34             catch (Exception)
 35             {
 36                 throw;
 37             }
 38         }
 39 
 40         /// <summary>
 41         /// 开始监听
 42         /// </summary>
 43         private void StartListener()
 44         {
 45             while (true)
 46             {
 47                 try
 48                 {
 49                     // TCP监听
 50                     TcpClient tcpClient = listener.AcceptTcpClient();
 51                     // 多线程处理数据
 52                     Thread thread = new Thread(new ParameterizedThreadStart(delegate { DealTcpData(tcpClient); }));
 53                     thread.Start();
 54                 }
 55                 catch (Exception ex)
 56                 {
 57                     Console.WriteLine(ex);
 58                 }
 59             }
 60         }
 61 
 62         /// <summary>
 63         /// 处理TCP数据
 64         /// <para>lv结构:数据的前4个字节(int),记录了数据区的长度</para>
 65         /// <para>注意:数据结构根据实际使用情况而定</para>
 66         /// </summary>
 67         private void DealTcpData(TcpClient tcpClient)
 68         {
 69             try
 70             {
 71                 if (tcpClient.Connected)
 72                 {
 73                     // 取得流
 74                     NetworkStream networkStream = tcpClient.GetStream();
 75                     networkStream.ReadTimeout = 500;
 76                     networkStream.WriteTimeout = 500;
 77                     #region 接收数据
 78                     // 接收数据储存
 79                     List<byte> list = new List<byte>();
 80                     // 数据区总长度
 81                     byte[] lenArr = new byte[4];
 82                     networkStream.Read(lenArr, 0, lenArr.Length);
 83                     int dataLen = BitConverter.ToInt32(lenArr, 0);
 84                     // 读取数据区数据
 85                     int total = 0;
 86                     // 每次读取的数据大小
 87                     int arrLen = 1024;
 88                     while (true)
 89                     {
 90                         // 读取数据
 91                         byte[] arr = new byte[arrLen];
 92                         int len = networkStream.Read(arr, 0, arr.Length);
 93                         for (int i = 0; i < len; i++)
 94                         {
 95                             list.Add(arr[i]);
 96                         }
 97                         // 判断数据的是否读取完成
 98                         total += len;
 99                         if (dataLen - total <= 0)
100                         {
101                             break;
102                         }
103                         if (dataLen - total < arrLen)
104                         {
105                             arrLen = dataLen - total;
106                         }
107                         Thread.Sleep(0);
108                     }
109                     // 根据功能或实际情况处理接收的数据
110                     byte[] receiveData = list.ToArray();
111                     #endregion
112                     #region 发送数据
113                     // 取得数据
114                     // 根据功能或实际情况做成需要发送的数据
115                     byte[] dataArr = new byte[] { 0x01, 0x02, 0x03, 0x04 }; // 测试数据
116                     if (dataArr != null)
117                     {
118                         // 数据长度
119                         byte[] lenArr = BitConverter.GetBytes(dataArr.Length);
120                         // 拼接数据头(lv结构)
121                         byte[] sendArr = new byte[lenArr.Length + dataArr.Length];
122                         lenArr.CopyTo(sendArr, 0);
123                         dataArr.CopyTo(sendArr, 4);
124                         // 发送数据
125                         try
126                         {
127                             lock (networkStream)
128                             {
129                                 networkStream.Write(sendArr, 0, sendArr.Length);
130                             }
131                         }
132                         catch { }
133                     }
134                     #endregion
135                 }
136             }
137             catch (Exception ex)
138             {
139                 // 错误日志
140                 Log.WriteError(ex);
141             }
142             finally
143             {
144                 // 判断TCP对象是否连接
145                 if (tcpClient != null)
146                 {
147                     JudgeTcpConnection(tcpClient);
148                 }
149             }
150         }
151 
152         /// <summary>
153         /// 判断TCP对象是否连接
154         /// </summary>
155         private void JudgeTcpConnection(TcpClient tcpClient, int timeout = 3)
156         {
157             try
158             {
159                 DateTime time = DateTime.Now;
160                 while (true)
161                 {
162                     // 超时时间判断
163                     if (time.AddSeconds(timeout) < DateTime.Now)
164                     {
165                         break;
166                     }
167                     // 连接状态判断
168                     if (!tcpClient.Connected)
169                     {
170                         break;
171                     }
172                     else
173                     {
174                         bool flag = tcpClient.Client.Poll(1000, SelectMode.SelectRead);
175                         if (flag)
176                         {
177                             break;
178                         }
179                     }
180                     Thread.Sleep(0);
181                 }
182             }
183             catch (Exception ex)
184             {
185                 // 错误日志
186                 Log.WriteError(ex);
187             }
188             finally
189             {
190                 // 关闭连接
191                 tcpClient.Close();
192             }
193         }
194     }
195 }

搜索

复制

标签:tcpClient,C#,System,TCP,int,using,new,服务端
From: https://www.cnblogs.com/smartnn/p/16635584.html

相关文章

  • SpringCloud中pom文件的配置
    pom文件中添加依赖SpringCloud父依赖<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.......
  • 报错:ReferenceError: __dirname is not defined in ES module scope
    报错:__dirnameisnotdefinedinESmodulescope前言新版NodeJS支持通过ESM方式导入模块,代码如://CommonJS规范(旧)const{readFileSync,writeFileSync}=r......
  • tiangolo/uvicorn-gunicorn:python3.8 fastapi docker部署
    经验教训:1、gunicornlog文件固定放置在容器中目录:/code/logs,所以这个目录必需映射出来;2、按照fastapi官方建议,uvicorn运行目录:/app,所以这个目录要映射到代码目录;3、......
  • TypeScript console.log日志输出等级
     日志输出等级是函数名控制的,不是参数控制的,函数名如下:下面的日志不会打断程序运行:    console.log("xxx")    console.info("xxx")    con......
  • django2.x -- 报错"UnicodeDecodeError: 'gbk' codec can't decode byte 0xa6 in posi
    解决方法:进入debug.py文件将331行代码修改编码方式为‘utf-8’......
  • BTC笔记-09-分叉
    BTC-分叉B站视频链接分叉可能出现的情况statefork在挖矿过程中,当有两个(或多个)矿工同时挖到一个区块并发布,将会形成临时性的分叉,称为statefork。这种分叉的原因是对......
  • C语言猜数字游戏
    C语言猜数字游戏题目十:猜数字游戏1.设计要求:有一定的容错功能,界面友好,功能齐全。2.设计提示:猜数字游戏规则:a)一个四位数,各位上的数不重复,从1到9。b)按以下......
  • BTC笔记-10-匿名性
    BTC-匿名性B站视频链接比特币的匿名性比特币的匿名性弱于现金,也弱于无需实名的银行,强于实名制的银行一个人可以拥有很多个账户,但这些账户可能会被关联起来(账户与账户......
  • jenkins集成sonar-scanner
    首先下载sonar-scanner 压缩包 sonar-scanner-cli-4.6.0.2311-linux.zip解压到jenkins工作目录下:  ......
  • mac远程连接windows
    MicrosoftRemoteDesktopBeta10.7.5下载:https://www.macwk.com/soft/microsoft-remote-desktop-beta 远程传送文件的方法 远程:......