当前位置: 首页 > news >正文

浅谈C#之TuochSocket

一、基本介绍

        TouchSocket 是一个为 .Net(包括 C#、VB.Net、F#)设计的整合性、超轻量级的网络通信框架,它包含了 tcp、udp、ssl、http、websocket、rpc、jsonrpc、webapi、xmlrpc 等一系列的通信模块。它能够一键式解决 TCP 黏分包问题,udp 大数据包分片组合问题等,使用协议模板可以快速实现「固定包头」、「固定长度」、「区间字符」等一系列的数据报文解析。

二、基本示例

以下是使用 TouchSocket 实现 Tcp 协议通讯,并解决分包、粘包问题的基本示例:

客户端代码示例:

TouchSocket.Sockets.TcpClient tcpClient = new TouchSocket.Sockets.TcpClient();
tcpClient.Connecting = (client, e) =>
{// 这里是指增加Int大小的包头client.SetDataHandlingAdapter(new FixedHeaderPackageAdapter() { FixedHeaderType = FixedHeaderType.Int });
};
tcpClient.Received = (client, byteBlock, obj) =>
{// 前4字节为包头,包含了包大小信息var data = new byte[byteBlock.Buffer.Length - 4];Array.Copy(byteBlock.Buffer, 4, data, 0, data.Length);// 从服务器收到信息string mes = Encoding.UTF8.GetString(data, 0, data.Length);var text = $"已从服务器接收到信息:{mes}\r\n";Console.WriteLine(text);Application.Current.Dispatcher.Invoke(() =>{textBlock.Text += text;});
};
tcpClient.Setup("127.0.0.1:21345");
tcpClient.Connect();
var str = "物服务器服务器服务器发起非亲非故";
var bytes = Encoding.UTF8.GetBytes(str);
var addLen = AddLen(bytes);
tcpClient.Send(addLen);
tcpClient.Close();// 增加包头
internal byte[] AddLen(byte[] bytes)
{int dataLength = bytes.Length;var dataLengthBytes = BitConverter.GetBytes(dataLength);byte[] sendBuffer = new byte[dataLengthBytes.Length + bytes.Length]; // 为数据包申请缓存,包括4个字节的分隔符和实际数据Buffer.BlockCopy(dataLengthBytes, 0, sendBuffer, 0, dataLengthBytes.Length); // 将长度信息写入数据包缓存的前面4个字节Buffer.BlockCopy(bytes, 0, sendBuffer, dataLengthBytes.Length, bytes.Length); // 将实际数据写入数据包缓存的后面return sendBuffer;
}

服务端代码示例:

TcpService service = new TcpService();
service.Connecting = (client, ex) =>
{client.SetDataHandlingAdapter(new FixedHeaderPackageAdapter() { FixedHeaderType = FixedHeaderType.Int });
};
service.Connected += (client, args) =>
{_socketClient = client;
};
service.Received = (client, byteBlock, requestInfo) =>
{var array = byteBlock.ToArray();// 前4字节为包头,包含了包大小信息var data = new byte[byteBlock.Buffer.Length - 4];Array.Copy(byteBlock.Buffer, 4, data, 0, data.Length);var text = $"已从{client.IP}:{client.Port}接收到信息:{Encoding.UTF8.GetString(data)}\r\n";Console.WriteLine(text); //Name即IP+PortApplication.Current.Dispatcher.Invoke(() =>{textBlock.Text += text;});
}


http://www.mrgr.cn/news/61688.html

相关文章:

  • 开发了一个成人学位英语助考微信小程序
  • C++中如何获取时间并格式化为字符串?
  • conda、virtualenv, venv分别是什么?它们之间有什么区别?
  • WPF+MVVM案例实战(三)- 动态数字卡片效果实现
  • vue3中ref和reactive的用法,区别和优缺点,以及使用场景
  • 《使用Gin框架构建分布式应用》阅读笔记:p212-p233
  • Python表格格式转换模块:tablib
  • 《机器学习by周志华》学习笔记-神经网络-04全局最小误差与局部极小误差
  • Vue.nextTick 使用指南:数据更新与 DOM 同步利器
  • webstrom编辑器中出现很多NBSP但是我去搜NBSP是没有的。复制这个编辑器中的NBSP粘贴发现这是个空格。怎么解决
  • Docker:技术架构的演进之路
  • 元素 offset client scroll 相关属性简介
  • Redis有什么不一样?
  • 【JVM第4课】程序计数器
  • 重构: 改善既有代码设计 - 第二版 第6--10章
  • 《IMM交互式多模型滤波MATLAB实践》专栏目录,持续更新……
  • HarmonyOS:$$语法:内置组件双向同步
  • 探索SpringBoot:构建高效闲一品交易平台
  • 微信支付宝小程序SEO优化的四大策略
  • 2024年10月HarmonyOS应用开发者基础认证全新题库
  • 打造城市新地标:气膜综合体育馆开放共享新体验—轻空间
  • idea 创建java文件增加注释
  • 3.1 大数据时代
  • ubuntu20.04系统安装
  • JavaWeb——Web入门(2/9)-SpringBootWeb:快速入门(入门程序需求、开发步骤、项目相关文件说明、小结)
  • 精益求精:提升机器学习模型表现的技巧”