找回密码
 注册帐号

扫一扫,访问微社区

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

19
回复
1625
查看
[ 复制链接 ]

15

主题

25

帖子

220

积分

Rank: 9Rank: 9Rank: 9

UID
327626
好友
6
蛮牛币
87
威望
0
注册时间
2019-7-19
在线时间
164 小时
最后登录
2019-12-1
2019-8-23 17:48:57 显示全部楼层 阅读模式

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

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

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

接下来 先讲讲服务端的吧

代码部分解析

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

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


里面就是一些数据结构了
网络消息自定义类 要继承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日久生情
3184/5000
排名
4092
昨日变化

0

主题

2279

帖子

3184

积分

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

UID
254705
好友
1
蛮牛币
2747
威望
0
注册时间
2017-11-16
在线时间
543 小时
最后登录
2020-9-18
2019-8-24 11:30:57 显示全部楼层
6666666666666666666666666
回复 支持 反对

使用道具 举报

0

主题

19

帖子

81

积分

Rank: 2Rank: 2

UID
329538
好友
0
蛮牛币
663
威望
0
注册时间
2019-8-16
在线时间
62 小时
最后登录
2020-1-23
2019-8-24 14:47:58 显示全部楼层
66666666666666666
回复 支持 反对

使用道具 举报

0

主题

19

帖子

81

积分

Rank: 2Rank: 2

UID
329538
好友
0
蛮牛币
663
威望
0
注册时间
2019-8-16
在线时间
62 小时
最后登录
2020-1-23
2019-8-24 14:51:36 显示全部楼层
6666666666
回复

使用道具 举报

5熟悉之中
837/1000
排名
10465
昨日变化

6

主题

252

帖子

837

积分

Rank: 5Rank: 5

UID
256471
好友
1
蛮牛币
1353
威望
0
注册时间
2017-11-27
在线时间
487 小时
最后登录
2020-9-21
2019-8-24 17:30:50 显示全部楼层
666666666666666666666669999999999999999999999999999
回复 支持 反对

使用道具 举报

0

主题

5

帖子

12

积分

Rank: 1

UID
155313
好友
0
蛮牛币
44
威望
0
注册时间
2016-7-5
在线时间
7 小时
最后登录
2019-9-6
2019-8-25 20:29:12 显示全部楼层
6666666666666666
回复 支持 反对

使用道具 举报

3偶尔光临
297/300

2

主题

126

帖子

297

积分

Rank: 3Rank: 3Rank: 3

UID
320388
好友
0
蛮牛币
275
威望
0
注册时间
2019-4-23
在线时间
169 小时
最后登录
2020-9-21
2019-8-26 08:22:38 显示全部楼层
参考一下
回复

使用道具 举报

7日久生情
4669/5000
排名
142
昨日变化

1

主题

438

帖子

4669

积分

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

UID
39981
好友
2
蛮牛币
10796
威望
0
注册时间
2014-8-15
在线时间
1874 小时
最后登录
2020-9-21

七夕浪漫情人

2019-8-26 09:15:18 显示全部楼层
6666666666666
回复

使用道具 举报

7日久生情
1758/5000
排名
2341
昨日变化

0

主题

382

帖子

1758

积分

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

UID
119648
好友
3
蛮牛币
1858
威望
0
注册时间
2015-8-25
在线时间
961 小时
最后登录
2020-7-30
QQ
2019-8-26 09:16:13 显示全部楼层
6666666666666666666
回复 支持 反对

使用道具 举报

7日久生情
2616/5000
排名
1826
昨日变化

14

主题

395

帖子

2616

积分

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

UID
217870
好友
1
蛮牛币
1468
威望
0
注册时间
2017-4-15
在线时间
1477 小时
最后登录
2020-9-21
2019-8-26 11:07:19 显示全部楼层
回复

使用道具 举报

7日久生情
4774/5000
排名
1485
昨日变化

0

主题

2142

帖子

4774

积分

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

UID
219676
好友
1
蛮牛币
6224
威望
0
注册时间
2017-7-12
在线时间
1778 小时
最后登录
2020-9-21

活力之星

2019-9-2 16:25:16 显示全部楼层
谢谢分享
回复

使用道具 举报

5熟悉之中
979/1000
排名
4267
昨日变化

1

主题

138

帖子

979

积分

Rank: 5Rank: 5

UID
21359
好友
1
蛮牛币
14
威望
0
注册时间
2014-4-14
在线时间
496 小时
最后登录
2020-9-18
QQ
2019-9-4 14:59:38 显示全部楼层
66666666666666
回复

使用道具 举报

7日久生情
2414/5000
排名
478
昨日变化

2

主题

104

帖子

2414

积分

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

UID
69739
好友
0
蛮牛币
3090
威望
0
注册时间
2015-1-20
在线时间
766 小时
最后登录
2020-8-13
2019-9-5 09:25:50 显示全部楼层
学习学习
回复

使用道具 举报

排名
64949
昨日变化

0

主题

10

帖子

20

积分

Rank: 1

UID
270945
好友
0
蛮牛币
21
威望
0
注册时间
2018-3-6
在线时间
9 小时
最后登录
2019-11-7
2019-9-26 17:33:33 显示全部楼层
666666666666666666666666666666666666666666666
回复 支持 反对

使用道具 举报

2初来乍到
104/150
排名
16956
昨日变化

0

主题

14

帖子

104

积分

Rank: 2Rank: 2

UID
92797
好友
0
蛮牛币
95
威望
0
注册时间
2015-4-16
在线时间
50 小时
最后登录
2020-4-3
2019-10-21 17:10:31 显示全部楼层
6666666666666666666666666
回复 支持 反对

使用道具 举报

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

本版积分规则