LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

基于EasyTcp4Net開(kāi)發(fā)一個(gè)功能較為完善的去持久化聊天軟件


2024年8月4日 18:51 本文熱度 1162

示例

發(fā)消息給自己

收到消息

發(fā)送圖片

消息發(fā)送中

重連中

發(fā)送失敗

數(shù)據(jù)包結(jié)構(gòu)以及拆包

定義數(shù)據(jù)包結(jié)構(gòu)

數(shù)據(jù)包結(jié)構(gòu)定義了每次發(fā)送一個(gè)數(shù)據(jù)的完整的數(shù)據(jù)結(jié)構(gòu),我們將包體長(zhǎng)度定義在包頭中來(lái)解決粘包和斷包的問(wèn)題。

數(shù)據(jù)包我們采用了簡(jiǎn)單的序列化成byte數(shù)組的方式來(lái)發(fā)送。

[StructLayout(LayoutKind.Sequential)]

public class Message<TBody> : IMsssage<TBody> where TBody : Packet

{

    //數(shù)據(jù)包包體長(zhǎng)度 4字節(jié)

    public int BodyLength { get; private set; }

    //消息類型 4字節(jié)

    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();

}

我們?cè)诜?wù)端和客戶端根據(jù)我們定義的數(shù)據(jù)結(jié)構(gòu),來(lái)調(diào)用EasyTcp4Net提供的固定包頭來(lái)解析數(shù)據(jù)包

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

文本/圖片發(fā)送

我們可以定義消息基類,再拓展兩個(gè)消息類,一個(gè)文本消息,一個(gè)圖片消息

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; }

}

我們還需要在界面中增加相關(guān)的文本和圖片的ViewModel

發(fā)送消息的時(shí)候,發(fā)送者可以立刻將消息添加到聊天界面,然后等待收到自己發(fā)送的消息從服務(wù)端發(fā)來(lái)的時(shí)候,根據(jù)狀態(tài)判斷消息是否發(fā)送成功,等待的時(shí)候可以將消息設(shè)置發(fā)送中的界面狀態(tài)顯示,這種發(fā)送消息邏輯和微信基本一致。

斷線處理

利用EasyTcp4Net提供的斷線的事件,可以非常方便的在服務(wù)端知道客戶端突然斷開(kāi)了,或者在客戶端知道和服務(wù)端連接斷開(kāi)了。

客戶端

_easyTcpClient.OnDisConnected += async (obj, e) =>

{

    Title = Title + _disConnectTip;

    await ReConnectAsync();

};

主要是觸發(fā)了重連的機(jī)制。

服務(wù)端 

_easyTcpServer.OnClientConnectionChanged += (obj, e) =>

 {

     if (e.Status == ConnectsionStatus.DisConnected)

     {

         _accounts.TryRemove(e.ClientSession.SessionId, out var account);

     }

 };

主要是將該用戶從在線列表中移除。

總結(jié)

總體來(lái)說(shuō)做一個(gè)聊天軟件需要考慮的細(xì)節(jié)比較多。
示例地址:https://github.com/BruceQiu1996/EasyChat

轉(zhuǎn)自https://www.cnblogs.com/qwqwQAQ/p/18330325


該文章在 2024/8/5 10:21:10 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
天堂va欧美ⅴa亚洲va在线 | 亚洲午夜中文字幕在线网 | 亚洲图片中文字幕 | 亚洲少妇AⅤ在线电 | 在线免费午夜国产网站 | 亚洲一区二区三区四区精品视频在线观看 |