<strong id="h7llx"><track id="h7llx"></track></strong>

<li id="h7llx"><object id="h7llx"></object></li>

<em id="h7llx"><acronym id="h7llx"><u id="h7llx"></u></acronym></em>
<rp id="h7llx"><acronym id="h7llx"><input id="h7llx"></input></acronym></rp>
<rp id="h7llx"></rp>
    <tbody id="h7llx"></tbody>

     找回密碼
     注冊帳號

    掃一掃,訪問微社區

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

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

    15

    主題

    25

    帖子

    220

    積分

    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, 下載次數: 257)

    增加的部分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熟悉之中
    625/1000
    排名
    6295
    昨日變化

    1

    主題

    194

    帖子

    625

    積分

    Rank: 5Rank: 5

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

    使用道具 舉報

    6蠻牛粉絲
    1214/1500
    排名
    3792
    昨日變化

    0

    主題

    45

    帖子

    1214

    積分

    Rank: 6Rank: 6Rank: 6

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

    使用道具 舉報

    6蠻牛粉絲
    1214/1500
    排名
    3792
    昨日變化

    0

    主題

    45

    帖子

    1214

    積分

    Rank: 6Rank: 6Rank: 6

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

    使用道具 舉報

    15

    主題

    25

    帖子

    220

    積分

    Rank: 9Rank: 9Rank: 9

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

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

    使用道具 舉報

    6蠻牛粉絲
    1214/1500
    排名
    3792
    昨日變化

    0

    主題

    45

    帖子

    1214

    積分

    Rank: 6Rank: 6Rank: 6

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

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

    使用道具 舉報

    0

    主題

    10

    帖子

    19

    積分

    Rank: 1

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

    使用道具 舉報

    7日久生情
    2505/5000
    排名
    1536
    昨日變化

    58

    主題

    858

    帖子

    2505

    積分

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

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

    使用道具 舉報

    3偶爾光臨
    151/300
    排名
    18290
    昨日變化

    1

    主題

    22

    帖子

    151

    積分

    Rank: 3Rank: 3Rank: 3

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

    使用道具 舉報

    4四處流浪
    316/500
    排名
    34891
    昨日變化

    0

    主題

    69

    帖子

    316

    積分

    Rank: 4

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

    使用道具 舉報

    6蠻牛粉絲
    1006/1500
    排名
    4049
    昨日變化

    2

    主題

    228

    帖子

    1006

    積分

    Rank: 6Rank: 6Rank: 6

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

    使用道具 舉報

    4四處流浪
    313/500
    排名
    64952
    昨日變化

    0

    主題

    168

    帖子

    313

    積分

    Rank: 4

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

    使用道具 舉報

    3偶爾光臨
    168/300
    排名
    16592
    昨日變化

    0

    主題

    55

    帖子

    168

    積分

    Rank: 3Rank: 3Rank: 3

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

    使用道具 舉報

    6蠻牛粉絲
    1425/1500
    排名
    1671
    昨日變化

    0

    主題

    113

    帖子

    1425

    積分

    Rank: 6Rank: 6Rank: 6

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

    使用道具 舉報

    6蠻牛粉絲
    1044/1500
    排名
    5171
    昨日變化

    32

    主題

    289

    帖子

    1044

    積分

    Rank: 6Rank: 6Rank: 6

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

    使用道具 舉報

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

    本版積分規則

    關注游戲蠻牛公眾號送vip
    神马电影34pp影视午夜|久久热视频任意撸|155女生能接受几厘米|97色色97成人
    <strong id="h7llx"><track id="h7llx"></track></strong>

    <li id="h7llx"><object id="h7llx"></object></li>

    <em id="h7llx"><acronym id="h7llx"><u id="h7llx"></u></acronym></em>
    <rp id="h7llx"><acronym id="h7llx"><input id="h7llx"></input></acronym></rp>
    <rp id="h7llx"></rp>
      <tbody id="h7llx"></tbody>