找回密码
 注册帐号

扫一扫,访问微社区

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

14
回复
817
查看
[ 复制链接 ]

15

主题

25

帖子

218

积分

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

0

主题

1884

帖子

2685

积分

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

UID
254705
好友
1
蛮牛币
2412
威望
0
注册时间
2017-11-16
在线时间
439 小时
最后登录
2020-1-20
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熟悉之中
505/1000
排名
10466
昨日变化

4

主题

199

帖子

505

积分

Rank: 5Rank: 5

UID
256471
好友
1
蛮牛币
617
威望
0
注册时间
2017-11-27
在线时间
200 小时
最后登录
2020-1-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偶尔光临
190/300

1

主题

108

帖子

190

积分

Rank: 3Rank: 3Rank: 3

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

使用道具 举报

7日久生情
4547/5000
排名
144
昨日变化

1

主题

437

帖子

4547

积分

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

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

七夕浪漫情人

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

使用道具 举报

6蛮牛粉丝
1359/1500
排名
2342
昨日变化

0

主题

346

帖子

1359

积分

Rank: 6Rank: 6Rank: 6

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

使用道具 举报

7日久生情
2373/5000
排名
1828
昨日变化

14

主题

390

帖子

2373

积分

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

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

使用道具 举报

7日久生情
3966/5000
排名
1487
昨日变化

0

主题

2152

帖子

3966

积分

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

UID
219676
好友
1
蛮牛币
4943
威望
0
注册时间
2017-7-12
在线时间
960 小时
最后登录
2020-1-10

活力之星

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

使用道具 举报

5熟悉之中
895/1000
排名
4269
昨日变化

1

主题

127

帖子

895

积分

Rank: 5Rank: 5

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

使用道具 举报

7日久生情
2405/5000
排名
480
昨日变化

2

主题

104

帖子

2405

积分

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

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

使用道具 举报

排名
64939
昨日变化

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

0

主题

14

帖子

101

积分

Rank: 2Rank: 2

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

使用道具 举报

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

本版积分规则