狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

基于EasyTcp4Net開發一個功能較為完善的去持久化聊天軟件


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

示例

發消息給自己

收到消息

發送圖片

消息發送中

重連中

發送失敗

數據包結構以及拆包

定義數據包結構

數據包結構定義了每次發送一個數據的完整的數據結構,我們將包體長度定義在包頭中來解決粘包和斷包的問題。

數據包我們采用了簡單的序列化成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

轉自https://www.cnblogs.com/qwqwQAQ/p/18330325


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