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

相关文章

一文带你搞懂Redis Stream的6种消息处理模式

《一文带你搞懂RedisStream的6种消息处理模式》Redis5.0版本引入的Stream数据类型,为Redis生态带来了强大而灵活的消息队列功能,本文将为大家详细介绍RedisStream的6... 目录1. 简单消费模式(Simple Consumption)基本概念核心命令实现示例使用场景优缺点2

在.NET平台使用C#为PDF添加各种类型的表单域的方法

《在.NET平台使用C#为PDF添加各种类型的表单域的方法》在日常办公系统开发中,涉及PDF处理相关的开发时,生成可填写的PDF表单是一种常见需求,与静态PDF不同,带有**表单域的文档支持用户直接在... 目录引言使用 PdfTextBoxField 添加文本输入域使用 PdfComboBoxField

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http