找回密码
 注册帐号

扫一扫,访问微社区

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

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

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, 下载次数: 67)

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

1

主题

194

帖子

606

积分

Rank: 5Rank: 5

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

使用道具 举报

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

0

主题

42

帖子

789

积分

Rank: 5Rank: 5

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

使用道具 举报

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

0

主题

42

帖子

789

积分

Rank: 5Rank: 5

UID
251989
好友
0
蛮牛币
6221
威望
0
注册时间
2017-11-1
在线时间
351 小时
最后登录
2020-1-12
地板
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熟悉之中
789/1000
排名
3797
昨日变化

0

主题

42

帖子

789

积分

Rank: 5Rank: 5

UID
251989
好友
0
蛮牛币
6221
威望
0
注册时间
2017-11-1
在线时间
351 小时
最后登录
2020-1-12
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日久生情
2485/5000
排名
1542
昨日变化

58

主题

854

帖子

2485

积分

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

UID
219600
好友
7
蛮牛币
3085
威望
0
注册时间
2017-4-27
在线时间
747 小时
最后登录
2019-12-20
8#
2019-9-23 09:03:33 只看该作者
感谢分享
回复

使用道具 举报

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

0

主题

23

帖子

124

积分

Rank: 2Rank: 2

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

使用道具 举报

3偶尔光临
219/300
排名
34890
昨日变化

0

主题

62

帖子

219

积分

Rank: 3Rank: 3Rank: 3

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

使用道具 举报

5熟悉之中
926/1000
排名
4054
昨日变化

2

主题

216

帖子

926

积分

Rank: 5Rank: 5

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

使用道具 举报

4四处流浪
309/500
排名
64939
昨日变化

0

主题

169

帖子

309

积分

Rank: 4

UID
143972
好友
0
蛮牛币
236
威望
0
注册时间
2016-3-30
在线时间
138 小时
最后登录
2019-12-27
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蛮牛粉丝
1232/1500
排名
1677
昨日变化

0

主题

93

帖子

1232

积分

Rank: 6Rank: 6Rank: 6

UID
165111
好友
0
蛮牛币
3030
威望
0
注册时间
2016-8-31
在线时间
363 小时
最后登录
2020-1-17
14#
2019-10-11 09:06:42 只看该作者
6666666666666
回复

使用道具 举报

6蛮牛粉丝
1005/1500
排名
5176
昨日变化

32

主题

286

帖子

1005

积分

Rank: 6Rank: 6Rank: 6

UID
254245
好友
3
蛮牛币
10009
威望
0
注册时间
2017-11-14
在线时间
431 小时
最后登录
2020-1-17
15#
2019-10-17 09:28:16 只看该作者
感谢楼主分享
回复

使用道具 举报

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

本版积分规则