c# Socket通讯中关于粘包,半包的处理,加分割符

2024-01-11 15:38

本文主要是介绍c# Socket通讯中关于粘包,半包的处理,加分割符,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Threading;namespace EventBase
{/*解决Socket的粘包处理使用方法A2DTcpClient client = new A2DTcpClient("127.0.0.1", 5000);client.NewMessageReceived += new MessageReceived(client_NewMessageReceived);client.Connect();client.Send("HELLO");client.Close();static void client_NewMessageReceived(string msg){Console.WriteLine(msg);}*/public delegate void MessageReceived(string msg);public class A2DTcpClient{public const string terminateString = "\r\n"; //消息的结尾标记public const int receiveBufferSize = 1024; //缓冲区大小private string RemoteServer { get; set; }private int RemotePort { get; set; }private TcpClient tcpClient;public event MessageReceived NewMessageReceived;public A2DTcpClient(string remoteServer, int remotePort){this.RemotePort = remotePort;this.RemoteServer = remoteServer;tcpClient = new TcpClient();}public void Connect(){if (tcpClient.Connected)throw new Exception("Connected, cannot re-connect.");tcpClient.Connect(this.RemoteServer, this.RemotePort);ThreadPool.QueueUserWorkItem(new WaitCallback(ReceiveMessage), tcpClient.Client);Thread.Sleep(2000);//强制暂停,为了上面的线程运行}public void Close(){if (!tcpClient.Connected)throw new Exception("Closed, cannot re-close.");tcpClient.Close();}StringBuilder sb = new StringBuilder(); //这个是用来保存:接收到了的,但是还没有结束的消息public void ReceiveMessage(object state) //这个函数会被以线程方式运行{Socket socket = (Socket)state;while (true){byte[] buffer = new byte[receiveBufferSize]; //buffer大小,此处为1024int receivedSize = socket.Receive(buffer);string rawMsg = System.Text.Encoding.Default.GetString(buffer, 0, receivedSize);int rnFixLength = terminateString.Length; //这个是指消息结束符的长度,此处为\r\nfor (int i = 0; i < rawMsg.Length; ) //遍历接收到的整个buffer文本{if (i <= rawMsg.Length - rnFixLength){if (rawMsg.Substring(i, rnFixLength) != terminateString) //非消息结束符,则加入sb{sb.Append(rawMsg[i]);i++;}else{this.OnNewMessageReceived(sb.ToString()); //找到了消息结束符,触发消息接收完成事件sb.Clear();i += rnFixLength;}}else{sb.Append(rawMsg[i]);i++;}}}}private void OnNewMessageReceived(string msg){if (this.NewMessageReceived != null)this.NewMessageReceived.Invoke(msg);}public void Send(string str){if (!this.tcpClient.Connected)throw new Exception("Closed, cannot send data.");str += terminateString;byte[] byteArray = System.Text.Encoding.Default.GetBytes(str);this.tcpClient.Client.Send(byteArray);}}
}

这篇关于c# Socket通讯中关于粘包,半包的处理,加分割符的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/594851

相关文章

C#中Guid类使用小结

《C#中Guid类使用小结》本文主要介绍了C#中Guid类用于生成和操作128位的唯一标识符,用于数据库主键及分布式系统,支持通过NewGuid、Parse等方法生成,感兴趣的可以了解一下... 目录前言一、什么是 Guid二、生成 Guid1. 使用 Guid.NewGuid() 方法2. 从字符串创建

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

电脑提示xlstat4.dll丢失怎么修复? xlstat4.dll文件丢失处理办法

《电脑提示xlstat4.dll丢失怎么修复?xlstat4.dll文件丢失处理办法》长时间使用电脑,大家多少都会遇到类似dll文件丢失的情况,不过,解决这一问题其实并不复杂,下面我们就来看看xls... 在Windows操作系统中,xlstat4.dll是一个重要的动态链接库文件,通常用于支持各种应用程序

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

C#如何去掉文件夹或文件名非法字符

《C#如何去掉文件夹或文件名非法字符》:本文主要介绍C#如何去掉文件夹或文件名非法字符的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#去掉文件夹或文件名非法字符net类库提供了非法字符的数组这里还有个小窍门总结C#去掉文件夹或文件名非法字符实现有输入字

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

Golang 日志处理和正则处理的操作方法

《Golang日志处理和正则处理的操作方法》:本文主要介绍Golang日志处理和正则处理的操作方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录1、logx日志处理1.1、logx简介1.2、日志初始化与配置1.3、常用方法1.4、配合defer