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

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

14

主题

23

帖子

172

积分

Rank: 9Rank: 9Rank: 9

UID
327626
好友
4
蛮牛币
129
威望
0
注册时间
2019-7-19
在线时间
126 小时
最后登录
2019-9-17

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

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

x
本帖最后由 开果 于 2019-8-27 11:04 编辑

接下来 先讲讲服务端的吧

代码部分解析

这里两个类都要引用 KGSocket dll的

1.ChatNetData  建立一个 客户端 服务端共用的数据 类库  因为要互相传的所以肯定要统一
  目标框架要选择这个Unity 3.5 .net Subset Base Class Libraries     导出的dll  Unity 才能用
新建的类库选这个


里面就是一些数据结构了
网络消息自定义类 要继承KGNetData 打上Serializable 序列化标签
枚举那些因为没办法序列化所以用Int的代替然后接收到再强转回来


[C#] 纯文本查看 复制代码
using KGSocket;
using System;

namespace ChatNetData
{
    [Serializable]
    public class ChatDatas:KGNetData
    {
        public byte[] HeadData;

        public string PlayerName;

        public SendChat Chatdata;
    }
}



[C#] 纯文本查看 复制代码
namespace ChatNetData
{
    
    public enum CMD
    {
        None,
        ReqLogin,
        ReqChatInfo,

        RspLogin,
        RspChatInfo,


    }
}



[C#] 纯文本查看 复制代码
namespace ChatNetData
{
    public enum ErrorInfo
    {
        None,
        NameRepeatsErr,//名字重复登录错误指令
    }
}




[C#] 纯文本查看 复制代码
using System;

namespace ChatNetData
{
    [Serializable]
    public  class SendChat
    {
        public string chat;
        public int Islocal;
    }
}



2.ChatDatasPack 用于分辨数据是哪个客户端发定的数据类型

[C#] 纯文本查看 复制代码
using ChatNetData;

namespace ChatServer
{
    public class ChatDatasPack
    {
        public ChatSession chatSession;

        public ChatDatas chatDatas;

    }
}



[C#] 纯文本查看 复制代码
using ChatNetData;


namespace ChatServer
{
    public class ChatDatasPack
    {
        public ChatSession chatSession;

        public ChatDatas chatDatas;

    }
}



3.ChatSessio  每个客户端的通信都是他来操作

要继承KGNetSession<ChatDatas>   ChatDatas就是自己定义继承KGNetData 的数据类  

这里主要的就是 OnDisRecive 断开回调 ,OnReciveData接收到数据回调  OnStartRecive 连接成功回调


OnReciveData(ChatDatas data) 接收到数据会 new一个ChatDatasPack 赋值  添加到ChatServe的任务队列 排序处理


[C#] 纯文本查看 复制代码
using KGSocket;
using ChatNetData;

namespace ChatServer
{
    public class ChatSession : KGNetSession<ChatDatas>
    {

        public int SessionID = 0;[/size][/color]
[color=rgb(51, 51, 51)][size=2]public string PlayerName;//缓存用户的名字[/size][/color][color=#333333][size=2]public byte[] HeadData;//缓存用户的头像图片数据

        protected override void OnDisRecive()
        {
            ("名字:" + PlayerName + "已下线").KLog();

        }
        protected override void OnReciveData(ChatDatas data)
        {
            ("收到名字:" + data.PlayerName + "的请求"+(CMD)data.Cmd).KLog();
            ChatServe.Instance.AddDataPackQue(this,data);
        }

        protected override void OnStartRecive()
        {
            SessionID = ChatServe.Instance.GetSessionID();
            ("ID:" + SessionID + "已连接").KLog();

        }
    }
}



4.ChatServe 这个就是创建服务器socket的了 缓存客户端 处理接收各个客户端信息返回的业务逻辑

要继承KGSocketServe<ChatSession, ChatDatas>


这里AddDataPackQue 就是添加接收到的消息任务队列的,会用到一个线程锁,
lock   这里简单说一下  作用是被lock的对象,里面的语句块 一次只被一个线程使用 如果在使用中的 其他线程就会排队等待执行完再轮到下一个  不会出现一窝蜂调用 顺序错乱情况
添加完后   在Update() 这里进行出列调用 主线程那边就可以直接一直调用Update一直刷新有没有新的任务队列就好
然后DisposePack这里就是处理从客户端接收到的数据了 判断指令调用对应业务逻辑


[C#] 纯文本查看 复制代码
using System.Collections.Generic;
using System.Linq;

using KGSocket;
using ChatNetData;

namespace ChatServer
{
    public class ChatServe : KGSocketServe<ChatSession, ChatDatas>
    {
        private static ChatServe instance;
        public static ChatServe Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new ChatServe();
                }
                return instance;
            }
            set => instance = value;
        }

        public static readonly object 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 void Update()
        {
            if (DataPackQue.Count>0)
            {
                lock (obj)
                {
                    DisposePack(DataPackQue.Dequeue());
                }
            }
        }


        public void DisposePack(ChatDatasPack pack)
        {
            switch ((CMD)pack.chatDatas.Cmd)
            {
                case CMD.ReqLogin:
                    //判断在线的名字是否重复
                    if (IsUserOnLine(pack.chatDatas.PlayerName))
                    {
                        pack.chatDatas.Err = (int)ErrorInfo.NameRepeatsErr;
                    }
                    else
                    {
                        pack.chatSession.PlayerName = pack.chatDatas.PlayerName;
                        pack.chatSession.HeadData = pack.chatDatas.HeadData;
                        pack.chatDatas.Cmd = (int)CMD.RspLogin;

                      
                    
                    }

                    pack.chatSession.SendData(pack.chatDatas);

                    break;
                case CMD.ReqChatInfo:
                    pack.chatDatas.Cmd = (int)CMD.RspChatInfo;
                    pack.chatDatas.HeadData = pack.chatSession.HeadData;
                    pack.chatDatas.PlayerName = pack.chatSession.PlayerName;
                    //发回给自身聊天
                    pack.chatSession.SendData(pack.chatDatas);
                    //改成对方
                    pack.chatDatas.Chatdata.Islocal = 1;
                    //分发到各个客户端 聊天消息
                    SessionList.Where(v=>v!=pack.chatSession).ToList().ForEach(v=> 
                    {
                        v.SendData(pack.chatDatas);
                    });
                    break;
            }
        }
        public void AddDataPackQue(ChatSession session, ChatDatas chatData)
        {
            lock (obj)
            {
                DataPackQue.Enqueue(new ChatDatasPack { chatSession = session, chatDatas = chatData });
            }
        }


    }
}





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




参与人数 1鲜花 +1 收起 理由
达维安爵士 + 1 很给力!

查看全部评分总评分 : 鲜花 +1

7日久生情
2212/5000
排名
4093
昨日变化

0

主题

1473

帖子

2212

积分

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

UID
254705
好友
1
蛮牛币
1999
威望
0
注册时间
2017-11-16
在线时间
377 小时
最后登录
2019-9-17
沙发
2019-8-24 11:30:57 只看该作者
6666666666666666666666666

0

主题

13

帖子

43

积分

Rank: 1

UID
329538
好友
0
蛮牛币
221
威望
0
注册时间
2019-8-16
在线时间
30 小时
最后登录
2019-9-17
板凳
2019-8-24 14:47:58 只看该作者
66666666666666666

0

主题

13

帖子

43

积分

Rank: 1

UID
329538
好友
0
蛮牛币
221
威望
0
注册时间
2019-8-16
在线时间
30 小时
最后登录
2019-9-17
地板
2019-8-24 14:51:36 只看该作者
6666666666
4四处流浪
359/500
排名
10465
昨日变化

4

主题

131

帖子

359

积分

Rank: 4

UID
256471
好友
1
蛮牛币
452
威望
0
注册时间
2017-11-27
在线时间
122 小时
最后登录
2019-9-17
5#
2019-8-24 17:30:50 只看该作者
666666666666666666666669999999999999999999999999999

0

主题

5

帖子

12

积分

Rank: 1

UID
155313
好友
0
蛮牛币
44
威望
0
注册时间
2016-7-5
在线时间
7 小时
最后登录
2019-9-6
6#
2019-8-25 20:29:12 只看该作者
6666666666666666
3偶尔光临
150/300

1

主题

99

帖子

150

积分

Rank: 3Rank: 3Rank: 3

UID
320388
好友
0
蛮牛币
53
威望
0
注册时间
2019-4-23
在线时间
50 小时
最后登录
2019-9-17
7#
2019-8-26 08:22:38 只看该作者
参考一下
7日久生情
4485/5000
排名
144
昨日变化

1

主题

433

帖子

4485

积分

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

UID
39981
好友
2
蛮牛币
9464
威望
0
注册时间
2014-8-15
在线时间
1695 小时
最后登录
2019-9-17

七夕浪漫情人

8#
2019-8-26 09:15:18 只看该作者
6666666666666
6蛮牛粉丝
1330/1500
排名
2342
昨日变化

0

主题

327

帖子

1330

积分

Rank: 6Rank: 6Rank: 6

UID
119648
好友
3
蛮牛币
1789
威望
0
注册时间
2015-8-25
在线时间
397 小时
最后登录
2019-9-10
QQ
9#
2019-8-26 09:16:13 只看该作者
6666666666666666666
7日久生情
2320/5000
排名
1828
昨日变化

14

主题

389

帖子

2320

积分

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

UID
217870
好友
1
蛮牛币
2563
威望
0
注册时间
2017-4-15
在线时间
1187 小时
最后登录
2019-9-11
10#
2019-8-26 11:07:19 只看该作者
7日久生情
3854/5000
排名
1487
昨日变化

0

主题

2150

帖子

3854

积分

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

UID
219676
好友
1
蛮牛币
4135
威望
0
注册时间
2017-7-12
在线时间
850 小时
最后登录
2019-9-17

活力之星

11#
2019-9-2 16:25:16 只看该作者
谢谢分享
5熟悉之中
883/1000
排名
4268
昨日变化

1

主题

123

帖子

883

积分

Rank: 5Rank: 5

UID
21359
好友
1
蛮牛币
24
威望
0
注册时间
2014-4-14
在线时间
415 小时
最后登录
2019-9-10
QQ
12#
2019-9-4 14:59:38 只看该作者
66666666666666
7日久生情
2401/5000
排名
479
昨日变化

2

主题

104

帖子

2401

积分

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

UID
69739
好友
0
蛮牛币
3115
威望
0
注册时间
2015-1-20
在线时间
753 小时
最后登录
2019-9-17
13#
2019-9-5 09:25:50 只看该作者
学习学习
您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则