香港6合总彩透码主论坛
 ?#19968;?#23494;码
 注册帐号

扫一扫,访问微社区

开果 一个简单 小型的C#Socket网络通信库 聊天室示例(七)

13
回复
434
查看
打印 上一主题 下一主题
[ 复制链接 ]

15

主题

25

帖子

213

积分

Rank: 9Rank: 9Rank: 9

UID
327626
好友
6
蛮牛币
142
威望
0
注册时间
2019-7-19
在线时间
159 小时
最后登录
2019-10-14

马?#29486;?#20876;,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐?#29275;?a href="member.php?mod=register" title="注册帐号">注册帐号

x
这里 接着上?#25991;?#20010;聊天室 说下改动吧 也没改多少
就?#24378;?#25143;端会发心跳包过来 服务器刷新超时时间并?#19968;?#24212; 给客户端,如果都超时没有接到回应给 就会主动回调 超时?#24405;?这就是心跳包的过程
服务端ChatServer全?#30475;?/strong>

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


            //添加新的会话?#24405;?
            AddSessionEvent += v => 
            {
                kGHeartBeatManage.AddConnectDic(v);
            };
            //删除会话?#24405;?
            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;
                    //赋?#21040;?#33394;的名字和头像图片数据
                    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;
}
}



?#33756;?#23601;差不多了AddSessionEvent/RemoveSessionEvent是 添加客户端 删除客户端的?#24405;?#22238;调 这里回调之后可以直接用AddConnectDic/RemoveConnectDic 进行增删心跳包数据
InitTimerEvent 进行初始化 然后进行开启.StartTimer

客户端
客户端这边增加的也挺少 先把Tool dll拖进来工程 然后增加部分全在GameRoot

GameRoot全?#30475;?#30721;  =  =?#33756;?#19978;传不了代码 直?#28216;?#20214;吧
GameRoot.txt (7.16 KB, 下载次数: 22)

增加的部分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);
        };

在连接完成的?#24405;?#22238;调中 初始化KGHeartBeatManage 并启动就可以了
2.回应心跳包指令 //然后判?#40092;?#21040;的指令 做处理      
[C#] 纯文本查看 复制代码
//然后判?#40092;?#21040;的指令 做处理
        switch ((CMD)(info.Cmd))
        {
            case CMD.HeartBeat:
                //接收到心跳包 刷新
              if(heartBeatManage!=null)
                heartBeatManage.UpdateOneHeat(socketClient.Client);
              
                break;

这里接收到了 就是进行了刷新UpdateOneHeat心跳包的超时时间和次数
好了 差不多这样

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

5熟悉之中
590/1000
排名
6300
昨日变化

1

主题

189

帖子

590

积分

Rank: 5Rank: 5

UID
31963
好友
0
蛮牛币
305
威望
0
注册时间
2014-6-30
在线时间
184 小时
最后登录
2019-9-27
沙发
2019-9-16 13:17:00 只看该作者
支持一个
回复

使用道具 举报

5熟悉之中
769/1000
排名
3797
昨日变化

0

主题

40

帖子

769

积分

Rank: 5Rank: 5

UID
251989
好友
0
蛮牛币
6163
威望
0
注册时间
2017-11-1
在线时间
333 小时
最后登录
2019-10-14
板凳
2019-9-16 15:15:16 只看该作者
支持一下
回复

使用道具 举报

5熟悉之中
769/1000
排名
3797
昨日变化

0

主题

40

帖子

769

积分

Rank: 5Rank: 5

UID
251989
好友
0
蛮牛币
6163
威望
0
注册时间
2017-11-1
在线时间
333 小时
最后登录
2019-10-14
地板
2019-9-16 15:18:27 只看该作者
有demo的地址吗
回复

使用道具 举报

15

主题

25

帖子

213

积分

Rank: 9Rank: 9Rank: 9

UID
327626
好友
6
蛮牛币
142
威望
0
注册时间
2019-7-19
在线时间
159 小时
最后登录
2019-10-14
5#
楼主 2019-9-16 16:10:29 只看该作者

回复就看见了啊
回复 支持 反对

使用道具 举报

5熟悉之中
769/1000
排名
3797
昨日变化

0

主题

40

帖子

769

积分

Rank: 5Rank: 5

UID
251989
好友
0
蛮牛币
6163
威望
0
注册时间
2017-11-1
在线时间
333 小时
最后登录
2019-10-14
6#
2019-9-17 10:33:16 只看该作者
开果 发表于 2019-9-16 16:10
回复就看见了啊

昨天好像不是这个链接内容 是我看错了吗
回复 支持 反对

使用道具 举报

0

主题

10

帖子

17

积分

Rank: 1

UID
331041
好友
0
蛮牛币
29
威望
0
注册时间
2019-9-2
在线时间
7 小时
最后登录
2019-9-23
7#
2019-9-20 10:49:55 只看该作者
好?#27599;矗?#22909;好学
回复

使用道具 举报

排名
1542
昨日变化

56

主题

840

帖子

2432

积分

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

UID
219600
好友
7
蛮牛币
3042
威望
0
注册时间
2017-4-27
在线时间
710 小时
最后登录
2019-10-14
8#
2019-9-23 09:03:33 只看该作者
?#34892;?#20998;享
回复

使用道具 举报

2初来乍到
119/150
排名
18294
昨日变化

0

主题

23

帖子

119

积分

Rank: 2Rank: 2

UID
218489
好友
2
蛮牛币
24
威望
0
注册时间
2017-4-19
在线时间
62 小时
最后登录
2019-10-14
9#
2019-9-23 11:45:56 只看该作者
支持一下棒棒的
回复

使用道具 举报

排名
34890
昨日变化

0

主题

56

帖子

166

积分

Rank: 3Rank: 3Rank: 3

UID
247710
好友
0
蛮牛币
377
威望
0
注册时间
2017-10-9
在线时间
102 小时
最后登录
2019-10-11
10#
2019-9-24 09:27:08 只看该作者
支持一下
回复

使用道具 举报

5熟悉之中
913/1000
排名
4053
昨日变化

2

主题

214

帖子

913

积分

Rank: 5Rank: 5

UID
1501
好友
0
蛮牛币
84
威望
0
注册时间
2013-8-5
在线时间
331 小时
最后登录
2019-10-14
11#
2019-9-27 10:12:29 只看该作者
好东西谢谢啦!!!!!!!!!!!!!!!!
回复

使用道具 举报

排名
64937
昨日变化

0

主题

102

帖子

179

积分

Rank: 3Rank: 3Rank: 3

UID
143972
好友
0
蛮牛币
108
威望
0
注册时间
2016-3-30
在线时间
75 小时
最后登录
2019-10-14
12#
2019-9-30 09:02:41 只看该作者
?#34892;?#20998;享~~~~~~~~~~~
回复

使用道具 举报

排名
16595
昨日变化

0

主题

48

帖子

158

积分

Rank: 3Rank: 3Rank: 3

UID
126531
好友
0
蛮牛币
1
威望
0
注册时间
2015-10-23
在线时间
69 小时
最后登录
2019-10-10
QQ
支持一下
回复

使用道具 举报

6蛮牛粉丝
1188/1500
排名
1677
昨日变化

0

主题

85

帖子

1188

积分

Rank: 6Rank: 6Rank: 6

UID
165111
好友
0
蛮牛币
2766
威望
0
注册时间
2016-8-31
在线时间
327 小时
最后登录
2019-10-14
6666666666666
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

香港6合总彩透码主论坛
狗万赢钱稳赚方法 三d一胆四拖对照表 极速赛车8码稳赚不赔绝招 五分彩定位胆个位稳赚公式 飞艇计划6码如何倍投 北京pk10冷热号走势图 快三大小单双稳赚群 二分彩技巧稳赚保本玩法 pk10技巧规律 幸运飞艇8码单期在线计划