找回密碼
 注冊帳號

掃一掃,訪問微社區

開果 一個簡單 小型的C#Socket網絡通信庫 聊天室示例(七)

22
回復
999
查看
打印 上一主題 下一主題
[ 復制鏈接 ]

15

主題

25

帖子

218

積分

Rank: 9Rank: 9Rank: 9

UID
327626
好友
6
蠻牛幣
87
威望
0
注冊時間
2019-7-19
在線時間
164 小時
最后登錄
2019-12-1

馬上注冊,結交更多好友,享用更多功能,讓你輕松玩轉社區。

您需要 登錄 才可以下載或查看,沒有帳號?注冊帳號

x
這里 接著上次那個聊天室 說下改動吧 也沒改多少
就是客戶端會發心跳包過來 服務器刷新超時時間并且回應 給客戶端,如果都超時沒有接到回應給 就會主動回調 超時事件 這就是心跳包的過程
服務端ChatServer全部代

[C#] 純文本查看 復制代碼
using System;
using System.Collections.Generic;
using System.Linq;

using KGSocket;
using ChatNetData;
using KGSocket.Tool;

namespace ChatServer
{
    //各個客戶端管理 業務邏輯都在這了
    public class ChatServe : KGSocketServe<ChatSession, ChatDatas>
    {
        #region 這里是單例
        private static ChatServe instance;
        public static ChatServe Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new ChatServe();
                }
                return instance;
            }
            set => instance = value;
        }
        #endregion

        public static readonly string obj = "lock";

        public Queue<ChatDatasPack> DataPackQue = new Queue<ChatDatasPack>();



        #region 緩存
        private int SessionID = 0;

        public int GetSessionID()
        {
            if (SessionID == int.MaxValue)
            {
                SessionID = 0;
            }
            return SessionID += 1;
        }

        public bool IsUserOnLine(string name)
        {
            return SessionList.Select(v => v.PlayerName).ToList().Contains(name);
        }


        #endregion


        public KGHeartBeatManage<ChatSession, KGHeartBeat> kGHeartBeatManage;
        public void Update()
        {
            if (DataPackQue.Count > 0)
            {
                //多線程調用就要加個線程鎖了避免同時調用
                lock (obj)
                {
                    DisposePack(DataPackQue.Dequeue());
                }
            }
        }

        public override void StartCreate(string ip, int port)
        {
            base.StartCreate(ip, port);
            kGHeartBeatManage = new KGHeartBeatManage<ChatSession, KGHeartBeat>().InitTimerEvent(null, lost =>
            {
                if (lost != null && lost.mSocket != null && lost.mSocket.Connected)
                {
                    (lost.SessionID + "ID心跳包超時 準備斷開連接").KLog(LogLevel.Err);

                    lost.Clear();
                }

            }).StartTimer();


            //添加新的會話事件
            AddSessionEvent += v => 
            {
                kGHeartBeatManage.AddConnectDic(v);
            };
            //刪除會話事件
            RemoveSessionEvent += v =>
            {
                kGHeartBeatManage.RemoveConnectDic(v);
            };
        }

        /// <summary>
        /// 處理客戶端發過來的消息
        /// </summary>
        /// <param name="pack"></param>
        public void DisposePack(ChatDatasPack pack)
        {
            switch ((CMD)pack.chatDatas.Cmd)
            {
                //心跳包指令
                case CMD.HeartBeat:
                    //更新心跳包
                    kGHeartBeatManage.UpdateOneHeat(pack.chatSession);
                    pack.chatSession.SendData(pack.chatDatas);
                    break;

                //登錄指令
                case CMD.ReqLogin:
                    //判斷在線的名字是否重復
                    if (IsUserOnLine(pack.chatDatas.PlayerName))
                    {
                        pack.chatDatas.Err = (int)ErrorInfo.NameRepeatsErr;

                    }
                    else
                    {
                        //返回指令
                        pack.chatDatas.Cmd = (int)CMD.RspLogin;
                        //存儲角色的名字和頭像圖片數據
                        pack.chatSession.PlayerName = pack.chatDatas.PlayerName;
                        pack.chatSession.HeadData = pack.chatDatas.HeadData;
                     
                    }

                    //返回消息給客戶端
                    pack.chatSession.SendData(pack.chatDatas);
                    break;
                //聊天指令
                case CMD.ReqChatInfo:
                    //返回指令
                    pack.chatDatas.Cmd = (int)CMD.RspChatInfo;
                    //賦值角色的名字和頭像圖片數據
                    pack.chatDatas.PlayerName = pack.chatSession.PlayerName;
                    pack.chatDatas.HeadData = pack.chatSession.HeadData;
                    //發回給自身聊天
                    pack.chatSession.SendData(pack.chatDatas);
                    //改成對方
                    pack.chatDatas.Chatdata.Islocal = 1;
                    //分發到各個客戶端 聊天消息
                    SessionList.Where(v => v != pack.chatSession).ToList().ForEach(v =>
                        {
                            (v.mSocket.Connected).ToString().KLog();
                            v.SendData(pack.chatDatas);
                        });
                    break;
            }


        }
        /// <summary>
        /// 這里是添加處理客戶端消息任務隊列
        /// </summary>
        /// <param name="session"></param>
        /// <param name="chatData"></param>
        public void AddDataPackQue(ChatSession session, ChatDatas chatData)
        {
            lock (obj)
            {
                DataPackQue.Enqueue(new ChatDatasPack { chatSession = session, chatDatas = chatData });
            }
        }


    }
}


增加的部分1.指令 添加多了一個HeartBeat的指令


[C#] 純文本查看 復制代碼
namespace ChatNetData{
        public enum CMD    {
        None, 
       HeartBeat,  
      ReqLogin,   
     ReqChatInfo, 
       RspLogin,    
    RspChatInfo,  

  }}


2. 在ChatServe里聲明持有一個KGHeartBeatManage進行初始化 在回應 添加多了一個HeartBeat的回應
[C#] 純文本查看 復制代碼
   public void DisposePack(ChatDatasPack pack)
        {
            switch ((CMD)pack.chatDatas.Cmd)
            {
                //心跳包指令
                case CMD.HeartBeat:
                    //更新心跳包
                    kGHeartBeatManage.UpdateOneHeat(pack.chatSession);
                    pack.chatSession.SendData(pack.chatDatas);
                    break;
}
}



貌似就差不多了AddSessionEvent/RemoveSessionEvent是 添加客戶端 刪除客戶端的事件回調 這里回調之后可以直接用AddConnectDic/RemoveConnectDic 進行增刪心跳包數據
InitTimerEvent 進行初始化 然后進行開啟.StartTimer

客戶端
客戶端這邊增加的也挺少 先把Tool dll拖進來工程 然后增加部分全在GameRoot

GameRoot全部代碼  =  =貌似上傳不了代碼 直接文件吧
GameRoot.txt (7.16 KB, 下載次數: 44)

增加的部分1.初始化
[C#] 純文本查看 復制代碼
socketClient.Client.OnStartReciveEvent += () => 
        {
           
            heartBeatManage = new KGHeartBeatManage<ChatNetSession, KGHeartBeat>().InitTimerEvent(send =>
            {
                socketClient.Client.SendData(new ChatDatas {Cmd=(int)CMD.HeartBeat });
            }, obj =>
            {
                Debug.Log("心跳包超時準備斷開連接");
                if (obj!=null)
                {
                    Debug.Log(heartBeatManage.ConnectDic[obj].Lostcount);
                    obj.Clear();
                }
               
            }).StartTimer();
            heartBeatManage.AddConnectDic(socketClient.Client,null,5,5);
        };

在連接完成的事件回調中 初始化KGHeartBeatManage 并啟動就可以了
2.回應心跳包指令 //然后判斷收到的指令 做處理      
[C#] 純文本查看 復制代碼
//然后判斷收到的指令 做處理
        switch ((CMD)(info.Cmd))
        {
            case CMD.HeartBeat:
                //接收到心跳包 刷新
              if(heartBeatManage!=null)
                heartBeatManage.UpdateOneHeat(socketClient.Client);
              
                break;

這里接收到了 就是進行了刷新UpdateOneHeat心跳包的超時時間和次數
好了 差不多這樣

游客,如果您要查看本帖隱藏內容請回復
回復

使用道具 舉報

5熟悉之中
601/1000
排名
6300
昨日變化

1

主題

193

帖子

601

積分

Rank: 5Rank: 5

UID
31963
好友
0
蠻牛幣
280
威望
0
注冊時間
2014-6-30
在線時間
191 小時
最后登錄
2019-11-27
沙發
2019-9-16 13:17:00 只看該作者
支持一個
回復

使用道具 舉報

5熟悉之中
785/1000
排名
3797
昨日變化

0

主題

42

帖子

785

積分

Rank: 5Rank: 5

UID
251989
好友
0
蠻牛幣
6197
威望
0
注冊時間
2017-11-1
在線時間
348 小時
最后登錄
2019-12-2
板凳
2019-9-16 15:15:16 只看該作者
支持一下
回復

使用道具 舉報

5熟悉之中
785/1000
排名
3797
昨日變化

0

主題

42

帖子

785

積分

Rank: 5Rank: 5

UID
251989
好友
0
蠻牛幣
6197
威望
0
注冊時間
2017-11-1
在線時間
348 小時
最后登錄
2019-12-2
地板
2019-9-16 15:18:27 只看該作者
有demo的地址嗎
回復

使用道具 舉報

15

主題

25

帖子

218

積分

Rank: 9Rank: 9Rank: 9

UID
327626
好友
6
蠻牛幣
87
威望
0
注冊時間
2019-7-19
在線時間
164 小時
最后登錄
2019-12-1
5#
樓主 2019-9-16 16:10:29 只看該作者

回復就看見了啊
回復 支持 反對

使用道具 舉報

5熟悉之中
785/1000
排名
3797
昨日變化

0

主題

42

帖子

785

積分

Rank: 5Rank: 5

UID
251989
好友
0
蠻牛幣
6197
威望
0
注冊時間
2017-11-1
在線時間
348 小時
最后登錄
2019-12-2
6#
2019-9-17 10:33:16 只看該作者
開果 發表于 2019-9-16 16:10
回復就看見了啊

昨天好像不是這個鏈接內容 是我看錯了嗎
回復 支持 反對

使用道具 舉報

0

主題

10

帖子

19

積分

Rank: 1

UID
331041
好友
0
蠻牛幣
38
威望
0
注冊時間
2019-9-2
在線時間
9 小時
最后登錄
2019-12-2
7#
2019-9-20 10:49:55 只看該作者
好好看,好好學
回復

使用道具 舉報

7日久生情
2482/5000
排名
1542
昨日變化

58

主題

854

帖子

2482

積分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
219600
好友
7
蠻牛幣
3063
威望
0
注冊時間
2017-4-27
在線時間
744 小時
最后登錄
2019-12-10
8#
2019-9-23 09:03:33 只看該作者
感謝分享
回復

使用道具 舉報

2初來乍到
120/150
排名
18294
昨日變化

0

主題

23

帖子

120

積分

Rank: 2Rank: 2

UID
218489
好友
2
蠻牛幣
25
威望
0
注冊時間
2017-4-19
在線時間
63 小時
最后登錄
2019-10-15
9#
2019-9-23 11:45:56 只看該作者
支持一下棒棒的
回復

使用道具 舉報

3偶爾光臨
214/300
排名
34890
昨日變化

0

主題

62

帖子

214

積分

Rank: 3Rank: 3Rank: 3

UID
247710
好友
0
蠻牛幣
485
威望
0
注冊時間
2017-10-9
在線時間
144 小時
最后登錄
2019-12-10
10#
2019-9-24 09:27:08 只看該作者
支持一下
回復

使用道具 舉報

5熟悉之中
923/1000
排名
4054
昨日變化

2

主題

216

帖子

923

積分

Rank: 5Rank: 5

UID
1501
好友
0
蠻牛幣
75
威望
0
注冊時間
2013-8-5
在線時間
339 小時
最后登錄
2019-12-4
11#
2019-9-27 10:12:29 只看該作者
好東西謝謝啦!!!!!!!!!!!!!!!!
回復

使用道具 舉報

4四處流浪
308/500
排名
64938
昨日變化

0

主題

169

帖子

308

積分

Rank: 4

UID
143972
好友
0
蠻牛幣
234
威望
0
注冊時間
2016-3-30
在線時間
137 小時
最后登錄
2019-12-9
12#
2019-9-30 09:02:41 只看該作者
感謝分享~~~~~~~~~~~
回復

使用道具 舉報

3偶爾光臨
163/300
排名
16595
昨日變化

0

主題

52

帖子

163

積分

Rank: 3Rank: 3Rank: 3

UID
126531
好友
0
蠻牛幣
1
威望
0
注冊時間
2015-10-23
在線時間
69 小時
最后登錄
2019-10-25
QQ
13#
2019-10-9 18:38:56 只看該作者
支持一下
回復

使用道具 舉報

6蠻牛粉絲
1216/1500
排名
1677
昨日變化

0

主題

91

帖子

1216

積分

Rank: 6Rank: 6Rank: 6

UID
165111
好友
0
蠻牛幣
2924
威望
0
注冊時間
2016-8-31
在線時間
349 小時
最后登錄
2019-12-10
14#
2019-10-11 09:06:42 只看該作者
6666666666666
回復

使用道具 舉報

6蠻牛粉絲
1001/1500
排名
5176
昨日變化

32

主題

285

帖子

1001

積分

Rank: 6Rank: 6Rank: 6

UID
254245
好友
3
蠻牛幣
9971
威望
0
注冊時間
2017-11-14
在線時間
428 小時
最后登錄
2019-11-12
15#
2019-10-17 09:28:16 只看該作者
感謝樓主分享
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 注冊帳號

本版積分規則

法甲球队主场名称