找回密码
 注册帐号

扫一扫,访问微社区

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

12
回复
389
查看
[ 复制链接 ]

14

主题

22

帖子

171

积分

Rank: 9Rank: 9Rank: 9

UID
327626
好友
4
蛮牛币
127
威望
0
注册时间
2019-7-19
在线时间
121 小时
最后登录
2019-9-16
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日久生情
2205/5000
排名
4093
昨日变化

0

主题

1467

帖子

2205

积分

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

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

使用道具 举报

0

主题

13

帖子

42

积分

Rank: 1

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

使用道具 举报

0

主题

13

帖子

42

积分

Rank: 1

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

使用道具 举报

4四处流浪
358/500
排名
10465
昨日变化

4

主题

131

帖子

358

积分

Rank: 4

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

使用道具 举报

2初来乍到
149/150

1

主题

99

帖子

149

积分

Rank: 2Rank: 2

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

使用道具 举报

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

1

主题

433

帖子

4485

积分

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

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

七夕浪漫情人

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
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
2019-8-26 11:07:19 显示全部楼层
回复

使用道具 举报

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

0

主题

2150

帖子

3853

积分

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

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

活力之星

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
2019-9-4 14:59:38 显示全部楼层
66666666666666
回复

使用道具 举报

7日久生情
2400/5000
排名
479
昨日变化

2

主题

104

帖子

2400

积分

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

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

使用道具 举报

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

本版积分规则