找回密码
 注册帐号

扫一扫,访问微社区

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

20
回复
2073
查看
[ 复制链接 ]

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日久生情
3748/5000
排名
4089
昨日变化

0

主题

2735

帖子

3748

积分

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

UID
254705
好友
1
蛮牛币
3186
威望
0
注册时间
2017-11-16
在线时间
651 小时
最后登录
2021-4-16
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
回复

使用道具 举报

6蛮牛粉丝
1062/1500
排名
10462
昨日变化

6

主题

257

帖子

1062

积分

Rank: 6Rank: 6Rank: 6

UID
256471
好友
1
蛮牛币
1896
威望
0
注册时间
2017-11-27
在线时间
707 小时
最后登录
2021-4-16
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
回复 支持 反对

使用道具 举报

4四处流浪
400/500

2

主题

134

帖子

400

积分

Rank: 4

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

使用道具 举报

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

1

主题

438

帖子

4711

积分

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

UID
39981
好友
2
蛮牛币
11412
威望
0
注册时间
2014-8-15
在线时间
1916 小时
最后登录
2021-4-15

七夕浪漫情人

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

使用道具 举报

7日久生情
2256/5000
排名
2337
昨日变化

0

主题

389

帖子

2256

积分

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

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

使用道具 举报

7日久生情
2729/5000
排名
1823
昨日变化

14

主题

396

帖子

2729

积分

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

UID
217870
好友
1
蛮牛币
1347
威望
0
注册时间
2017-4-15
在线时间
1589 小时
最后登录
2021-1-18
2019-8-26 11:07:19 显示全部楼层
{:104:}{:104:}
回复

使用道具 举报

8常驻蛮牛
5874/10000
排名
1481
昨日变化

0

主题

2142

帖子

5874

积分

Rank: 8Rank: 8

UID
219676
好友
1
蛮牛币
7102
威望
0
注册时间
2017-7-12
在线时间
2878 小时
最后登录
2021-4-16

活力之星

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

使用道具 举报

6蛮牛粉丝
1423/1500
排名
4264
昨日变化

1

主题

140

帖子

1423

积分

Rank: 6Rank: 6Rank: 6

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

使用道具 举报

7日久生情
2420/5000
排名
474
昨日变化

2

主题

104

帖子

2420

积分

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

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

使用道具 举报

排名
64952
昨日变化

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初来乍到
111/150
排名
16953
昨日变化

0

主题

16

帖子

111

积分

Rank: 2Rank: 2

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

使用道具 举报

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

本版积分规则

关注游戏蛮牛公众号送vip