找回密码
 注册帐号

扫一扫,访问微社区

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

16
回复
529
查看
[ 复制链接 ]

15

主题

25

帖子

213

积分

Rank: 9Rank: 9Rank: 9

UID
327626
好友
6
蛮牛币
142
威望
0
注册时间
2019-7-19
在线时间
159 小时
最后登录
2019-10-14
2019-9-16 08:46:25 显示全部楼层 阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

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, 下载次数: 29)
回复

使用道具 举报

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熟悉之中
775/1000
排名
3797
昨日变化

0

主题

42

帖子

775

积分

Rank: 5Rank: 5

UID
251989
好友
0
蛮牛币
6171
威望
0
注册时间
2017-11-1
在线时间
337 小时
最后登录
2019-10-17
2019-9-16 15:15:16 显示全部楼层
支持一下
回复

使用道具 举报

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

0

主题

42

帖子

775

积分

Rank: 5Rank: 5

UID
251989
好友
0
蛮牛币
6171
威望
0
注册时间
2017-11-1
在线时间
337 小时
最后登录
2019-10-17
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
楼主 2019-9-16 16:10:29 显示全部楼层

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

使用道具 举报

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

0

主题

42

帖子

775

积分

Rank: 5Rank: 5

UID
251989
好友
0
蛮牛币
6171
威望
0
注册时间
2017-11-1
在线时间
337 小时
最后登录
2019-10-17
2019-9-17 10:33:16 显示全部楼层
开果 发表于 2019-9-16 16:10
回复就看见了啊

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

使用道具 举报

0

主题

10

帖子

18

积分

Rank: 1

UID
331041
好友
0
蛮牛币
35
威望
0
注册时间
2019-9-2
在线时间
8 小时
最后登录
2019-10-18
2019-9-20 10:49:55 显示全部楼层
好好看,好好学
回复

使用道具 举报

7日久生情
2446/5000
排名
1542
昨日变化

56

主题

845

帖子

2446

积分

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

UID
219600
好友
7
蛮牛币
3044
威望
0
注册时间
2017-4-27
在线时间
719 小时
最后登录
2019-10-22
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
2019-9-23 11:45:56 显示全部楼层
支持一下棒棒的
回复

使用道具 举报

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

0

主题

56

帖子

173

积分

Rank: 3Rank: 3Rank: 3

UID
247710
好友
0
蛮牛币
339
威望
0
注册时间
2017-10-9
在线时间
109 小时
最后登录
2019-10-22
2019-9-24 09:27:08 显示全部楼层
支持一下
回复

使用道具 举报

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

2

主题

214

帖子

914

积分

Rank: 5Rank: 5

UID
1501
好友
0
蛮牛币
85
威望
0
注册时间
2013-8-5
在线时间
332 小时
最后登录
2019-10-15
2019-9-27 10:12:29 显示全部楼层
好东西谢谢啦!!!!!!!!!!!!!!!!
回复

使用道具 举报

3偶尔光临
215/300
排名
64937
昨日变化

0

主题

126

帖子

215

积分

Rank: 3Rank: 3Rank: 3

UID
143972
好友
0
蛮牛币
136
威望
0
注册时间
2016-3-30
在线时间
87 小时
最后登录
2019-10-22
2019-9-30 09:02:41 显示全部楼层
感谢分享~~~~~~~~~~~
回复

使用道具 举报

3偶尔光临
158/300
排名
16595
昨日变化

0

主题

48

帖子

158

积分

Rank: 3Rank: 3Rank: 3

UID
126531
好友
0
蛮牛币
1
威望
0
注册时间
2015-10-23
在线时间
69 小时
最后登录
2019-10-10
QQ
2019-10-9 18:38:56 显示全部楼层
支持一下
回复

使用道具 举报

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

0

主题

86

帖子

1192

积分

Rank: 6Rank: 6Rank: 6

UID
165111
好友
0
蛮牛币
2795
威望
0
注册时间
2016-8-31
在线时间
330 小时
最后登录
2019-10-22
2019-10-11 09:06:42 显示全部楼层
6666666666666
回复

使用道具 举报

5熟悉之中
997/1000
排名
5176
昨日变化

32

主题

284

帖子

997

积分

Rank: 5Rank: 5

UID
254245
好友
3
蛮牛币
9924
威望
0
注册时间
2017-11-14
在线时间
425 小时
最后登录
2019-10-21
6 天前 显示全部楼层
感谢楼主分享
回复

使用道具 举报

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

本版积分规则