基于EasyTcp4Net开发一个功能较为完善的去持久化聊天软件

news/2024/11/15 16:02:24/文章来源:https://www.cnblogs.com/qwqwQAQ/p/18330325

之前自己写了一篇介绍TCP的一些常用的功能介绍和特征,并且用代码做了示例,最终开发了一个EasyTcp4Net的TCP工具库,其最大的特色就是使用了微软提供的高性能库中的一些数据结构来处理TCP数据。
最近辞职待业在家,也没啥事做,就利用自己写的TCP通讯库基础上开发了一个示例的聊天程序,功能包括,文本发送,图片发送,断线重连,消息发送成功确认,消息发送失败提示等。

示例

发消息给自己

image

收到消息

image

发送图片

image

消息发送中

image

重连中

image

发送失败

image

数据包结构以及拆包

定义数据包结构

数据包结构定义了每次发送一个数据的完整的数据结构,我们将包体长度定义在包头中来解决粘包和断包的问题。
数据包我们采用了简单的序列化成byte数组的方式来发送。

[StructLayout(LayoutKind.Sequential)]
public class Message<TBody> : IMsssage<TBody> where TBody : Packet
{//数据包包体长度 4字节public int BodyLength { get; private set; }//消息类型 4字节public MessageType MessageType { get; set; }public TBody? Body { get; set; }private Message<TBody> Deserialize(byte[] bodyData){var bodyStr = System.Text.Encoding.Default.GetString(bodyData);Body = JsonSerializer.Deserialize<TBody>(bodyStr);return this;}public static Message<TBody> FromBytes(ReadOnlyMemory<byte> data){Message<TBody> packet = new Message<TBody>();packet.BodyLength = BinaryPrimitives.ReadInt32BigEndian(data.Slice(0, 4).Span);packet.MessageType = (MessageType)BinaryPrimitives.ReadInt32BigEndian(data.Slice(4, 4).Span);packet.Deserialize(data.Slice(8, packet.BodyLength).Span.ToArray());return packet;}public byte[] Serialize(){var Length = 4 + 4;var bodyArray = System.Text.Encoding.Default.GetBytes(JsonSerializer.Serialize(Body));BodyLength = bodyArray.Length;Length += bodyArray.Length;byte[] result = new byte[Length];result.AddInt32(0, bodyArray.Length);result.AddInt32(4, (int)MessageType);Buffer.BlockCopy(bodyArray, 0, result, 8, bodyArray.Length);return result;}public TBody GetBody(){return Body;}
}public interface IMsssage <out TBody> where TBody : Packet
{public TBody GetBody();
}

我们在服务端和客户端根据我们定义的数据结构,来调用EasyTcp4Net提供的固定包头来解析数据包

_easyTcpClient.SetReceiveFilter(new FixedHeaderPackageFilter(8, 0, 4, false));

文本/图片发送

我们可以定义消息基类,再拓展两个消息类,一个文本消息,一个图片消息

public class SendMessagePacket : Packet
{public string MessageId { get; set; } = Guid.NewGuid().ToString();public string From { get; set; }public string To { get; set; }
}

图片消息

public class SendImageMessagePacket : SendMessagePacket
{public byte[] Data { get; set; }public string FileName { get; set; }
}

文本消息

public class SendTextMessagePacket : SendMessagePacket
{public string Text { get; set; }
}

我们还需要在界面中增加相关的文本和图片的ViewModel
发送消息的时候,发送者可以立刻将消息添加到聊天界面,然后等待收到自己发送的消息从服务端发来的时候,根据状态判断消息是否发送成功,等待的时候可以将消息设置发送中的界面状态显示,这种发送消息逻辑和微信基本一致。

断线处理

利用EasyTcp4Net提供的断线的事件,可以非常方便的在服务端知道客户端突然断开了,或者在客户端知道和服务端连接断开了。

客户端

_easyTcpClient.OnDisConnected += async (obj, e) =>
{Title = Title + _disConnectTip;await ReConnectAsync();
};

主要是触发了重连的机制。

服务端

 _easyTcpServer.OnClientConnectionChanged += (obj, e) =>{if (e.Status == ConnectsionStatus.DisConnected){_accounts.TryRemove(e.ClientSession.SessionId, out var account);}};

主要是将该用户从在线列表中移除。

总结

总体来说做一个聊天软件需要考虑的细节比较多。
示例地址:https://github.com/BruceQiu1996/EasyChat

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/773651.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言其二

1.代码区:可读可执行 2.堆栈:(参数,局部变量,临时数据) 3.堆:(动态申请,大小可变)可读可写 5.常量区:只读 变量 变量的声明 全局变量 int a,b,c; //全局变量的声明 void Fun() { a = 10; //全局变量的赋值 b = 20; c = a; } 局部变量 void Fun() { …

[米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-15 SPI接收程序设计

软件版本:Anlogic -TD5.9.1-DR1_ES1.1 操作系统:WIN10 64bit 硬件平台:适用安路(Anlogic)FPGA 实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台:https://milianke.tmall.com/ 登录"米联客"FPGA社区 http://www.uisrc.com 视频课程、答疑解惑! 1概述SP…

自写Json转换工具

前面写了简单的API测试工具ApiTools,返回的json有时需要做很多转换,于是开发了这个工具。 功能包括 1、json字符串转为表格,可以直观的展示,也可以复制,并支持转换后的表格点击列头进行排序,比较方便地定位数据。2、表格转为EXCEL,就是导出Excel文件,支持2003和2007格式…

[米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-13 SPI通信协议原理

SPI(串行外围设备接口)通信协议是一种高速、全双工、同步通信总线。它通过四根管脚实现控制和数据传输,广泛应用于EEPROM、Flash、RTC、ADC、DSP等设备,是一种重要的低速通讯协议。SPI协议具有高速、全双工、同步、主从式等特点,接口速度最高可达上百兆,因此不仅适用于低…

DiffSeq

目录概 符号说明 流程 代码 Gong S., Li M., Feng J., Wu Z. and Kong L. DiffuSeq: Sequence to sequence text generation with diffusion models. In International Conference on Learning Representations (ICLR), 2023概 本文提出了一种用于 Seq2Seq 的不需要 classifier…

嵌入式测试手册——基于NXP iMX6ULL开发板(2)

基于测试板卡:创龙科技TLIMX6U-EVM是一款基于NXP i.MX 6ULL的ARM Cortex-A7高性能低功耗处理器设计的评估板,由核心板和评估底板组成。核心板经过专业的PCB Layout和高低温测试验证,稳定可靠,可满足各种工业应用环境。评估板接口资源丰富,引出双路网口、双路RS485、双路CA…

广东注塑行业MES系统——优化生产管理的利器

注塑行业MES系统是优化生产管理的利器,具有以下优势和作用: 实现生产过程的数字化管理:注塑行业MES系统可以实现生产过程的数字化管理,实时监控生产数据、设备状态和生产进度,提高生产过程的可视化和透明度。提高生产效率:通过优化生产计划、资源调度和工艺流程,注塑MES…

嵌入式基础测试手册——基于NXP iMX6ULL开发板(4)

前 言 本文档适用开发环境: Windows开发环境:Windows 7 64bit、Windows 10 64bit 虚拟机:VMware15.1.0 Linux开发环境:Ubuntu18.04.4 64bit U-Boot:U-Boot-2020.04 Kernel:Linux-5.4.70 Linux SDK:5.4.70_2.3.0 基于测试板卡:创龙科技TLIMX6U-EVM是一款基于NXP i.MX 6…

Markdown 常用语法

上一篇简单介绍了 Markdown 是什么,以及如何使用,本篇就来详细说说 Markdown 的常见语法。上一篇简单介绍了 Markdown 是什么,以及如何使用,本篇就来详细说说 Markdown 的常见语法。 ‍ 注意,并不是所有编辑器,都支持所有的 Markdown 语法,如果遇到失效的也不必疑惑。 此…

软件无线电系统基带信号处理卡:612-基于6UVPX C6678+XCVU9P的4路2Gsps AD 8路2Gsps DA 信号处理板卡

基于6UVPX C6678+XCVU9P的4路2Gsps AD 8路2Gsps DA 信号处理板卡 一、板卡概述板卡基于6U VPX标准结构,包含一个C6678 DSP芯片,一个XCVU9P 高性能FPGA,8路DA ,4路AD。 二、技术指标● DSP处理器采用TI 8核处理器TMS320C6678; ● DSP 外挂一组64bit DDR3颗粒,总容量2G…

AM62x相比AM335x,到底升级了什么?

Sitara作为TI处理器经典系列,曾推出众多优秀处理器型号(如AM335x)。因其能在相同价位下,提供比市面上其他厂商处理器更优良的性能,并凭借GPMC高速并口、PRU协处理器等个性化硬件资源,可提供更便利的拓展性,在工业控制、能源电力、轨道交通、智慧医疗等领域广受用户欢迎。…