开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:1876

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 2331|回复: 19

[qingfeng346] Unity 简易 Socket库

[复制链接]  [移动端链接]
排名
5213
昨日变化
5

12

主题

101

帖子

426

积分

Rank: 9Rank: 9Rank: 9

UID
182
好友
5
蛮牛币
542
威望
0
注册时间
2013-6-3
在线时间
73 小时
最后登录
2017-7-20
发表于 2017-5-5 11:32:16 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 qingfeng346 于 2017-5-5 11:37 编辑

     平常开发游戏,最不想被一些基础的库烦恼,但是网络又基本是每个游戏必须的库,有时找一个网络库,太大而且在unity上个平台兼容性不好,只能自己写一个简单的库,有时候很烦,今天我为大家推荐一个简易的c# socket库 【ScorpioNet
  ScorpioNet库源文件很小,所有文件加起来只有20K,支持 ipv4和ipv6,支持建立客户端和服务端
  兼容所有常用平台
* Editor
* PC
* 安卓
* IOS
* UWP



   协议头的数据结构
int(数据总长度)
byte(数据类型,可以区分消息类型,例如 0是普通游戏消息,1是一些简单的命令,2是发送一个文件等等)
short(数据ID)
byte[]





下面是源项目自带的demo文件
[C#] 纯文本查看 复制代码
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Scorpio.Net;
using System.Net.Sockets;
using System.Threading;
namespace ScorpioNet {
    public class Log : ILog {
        public void debug(string format) {
            Console.WriteLine("debug : " + format);
        }
        public void info(string format) {
            Console.WriteLine("info : " + format);
        }
        public void warn(string format) {
            Console.WriteLine("warn : " + format);
        }
        public void error(string format) {
            Console.WriteLine("error : " + format);
        }
    }
    public class ServerFactory : ScorpioConnectionFactory {
        public ScorpioConnection create() {
            return new ServerConnection();
        }
    }
    public class ServerConnection : ScorpioConnection {
        private Dictionary<short, string> m_Files = new Dictionary<short, string>();
        private object m_Sync = new object();
        public override void OnInitialize() {
            Console.WriteLine("有新连接进入 " + m_Socket.GetSocket().RemoteEndPoint.ToString());
        }
        public override void OnRecv(byte type, short msgId, int length, byte[] data) {
            lock (m_Sync) {
                if (type == 0) {
                    string name = Path.Combine(Environment.CurrentDirectory, Encoding.UTF8.GetString(data));
                    if (File.Exists(name)) File.Delete(name);
                    m_Files[msgId] = name;
                    Console.WriteLine("开始收取 [" + name + "] 文件");
                } else if (type == 1) {
                    if (m_Files.ContainsKey(msgId)) {
                        string name = m_Files[msgId];
                        using (FileStream stream = new FileStream(name, FileMode.Append)) {
                            stream.Write(data, 0, data.Length);
                        }
                    }
                } else if (type == 2) {
                    if (m_Files.ContainsKey(msgId)) {
                        string name = m_Files[msgId];
                        m_Files.Remove(msgId);
                        Console.WriteLine("收取文件 [" + name + "] 完成");
                    }
                } else if (type == 3) {
                    string str = Encoding.UTF8.GetString(data);
                    Console.WriteLine("服务器执行命令 " + str);
                } else {
                    Console.WriteLine("服务器收到消息 类型 " + type + "  msgId " + msgId + "  数据 : " + Encoding.UTF8.GetString(data));
                    m_Socket.Send(type, msgId, data);
                }
            }
        }
        public override void OnDisconnect() {
            Console.WriteLine("有新连接断开连接" + m_Socket.GetSocket().RemoteEndPoint.ToString());
        }
    }
    public class ClientFactory : ScorpioConnectionFactory {
        public ScorpioConnection create() {
            return ClientConnection.GetInstance();
        }
    }
    public class ClientConnection : ScorpioConnection {
        private static ClientConnection instance;
        public static ClientConnection GetInstance() {
            if (instance == null)
                instance = new ClientConnection();
            return instance;
        }
        private short FILE_ID = 0;
        public override void OnInitialize() {
            Console.WriteLine("连接成功");
        }
        public void SendFile(string file) {
            if (!File.Exists(file)) {
                Console.WriteLine("文件 [" + file + "] 不存在");
                return;
            }
            short fileID = FILE_ID++;
            using (FileStream stream = File.OpenRead(file)) {
                Send(0, fileID, Encoding.UTF8.GetBytes(Path.GetFileName(stream.Name)));
                byte[] data = new byte[8192];
                int count = 0;
                while ((count = stream.Read(data, 0, 8192)) > 0) {
                    Send(1, fileID, data, 0, count);
                }
                Send(2, fileID, null);
            }
        }
        public override void OnRecv(byte type, short msgId, int length, byte[] data) {
            Console.WriteLine("客户端收到消息 类型 " + type + "  msgId " + msgId + "  数据 : " + Encoding.UTF8.GetString(data));
        }
        public override void OnDisconnect() {
            Console.WriteLine("断开连接");
        }
    }
    class Program {
        static void Main(string[] args) {
            logger.SetLog(new Log());
            ServerSocket server = new ServerSocket(new ServerFactory());
            server.Listen(9999);
            ClientSocket client = new ClientSocket(new ClientFactory());
            client.Connect("localhost", 9999);
            while (true) {
                string str = Console.ReadLine();
                if (str.StartsWith("file ")) {
                    ClientConnection.GetInstance().SendFile(str.Replace("file ", ""));
                } else if (str.StartsWith("cmd ")) {
                    ClientConnection.GetInstance().Send(3, 0, Encoding.UTF8.GetBytes(str.Replace("cmd ", "")));
                } else if (str == "exit") {
                    ClientConnection.GetInstance().Disconnect();
                    break;
                } else {
                    ClientConnection.GetInstance().Send(100, 9999, Encoding.UTF8.GetBytes(str));
                }
            }
            Console.ReadKey();
        }
    }
}


源码地址:https://github.com/qingfeng346/ScorpioNet
QQ交流群:245199668


回复

使用道具 举报

头像被屏蔽
排名
94
昨日变化
2

2

主题

2638

帖子

5868

积分

UID
47709
好友
1
蛮牛币
4001
威望
0
注册时间
2014-10-5
在线时间
1192 小时
最后登录
2017-9-24
发表于 2017-5-5 12:38:58 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1243/1500
排名
2175
昨日变化
15

0

主题

422

帖子

1243

积分

Rank: 6Rank: 6Rank: 6

UID
164723
好友
0
蛮牛币
2525
威望
0
注册时间
2016-8-29
在线时间
313 小时
最后登录
2017-9-26
发表于 2017-5-6 09:30:53 | 显示全部楼层

回复

使用道具 举报

排名
51131
昨日变化
561

0

主题

7

帖子

14

积分

Rank: 1

UID
160978
好友
0
蛮牛币
23
威望
0
注册时间
2016-8-6
在线时间
5 小时
最后登录
2017-8-15
发表于 2017-5-6 21:35:10 | 显示全部楼层
777777777777

回复

使用道具 举报

排名
14247
昨日变化
12

1

主题

15

帖子

75

积分

Rank: 2Rank: 2

UID
220972
好友
0
蛮牛币
436
威望
0
注册时间
2017-5-7
在线时间
23 小时
最后登录
2017-8-8
发表于 2017-5-7 11:02:59 | 显示全部楼层
11111111111111111111111

回复 支持 反对

使用道具 举报

5熟悉之中
510/1000
排名
3674
昨日变化
18

0

主题

83

帖子

510

积分

Rank: 5Rank: 5

UID
210517
好友
0
蛮牛币
1809
威望
0
注册时间
2017-3-7
在线时间
123 小时
最后登录
2017-9-26
发表于 2017-5-8 08:51:31 | 显示全部楼层
谢谢分享!
[发帖际遇]: 黑名單上有你 在论坛发帖时没有注意,被小偷偷去了 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

4四处流浪
467/500
排名
4969
昨日变化
1

0

主题

95

帖子

467

积分

Rank: 4

UID
207120
好友
0
蛮牛币
629
威望
0
注册时间
2017-2-18
在线时间
158 小时
最后登录
2017-9-26
发表于 2017-5-8 10:58:59 | 显示全部楼层
可以啊。厉害了
[发帖际遇]: 周-joe 发帖时在路边捡到 2 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复

使用道具 举报

7日久生情
1970/5000
排名
992
昨日变化
1

3

主题

406

帖子

1970

积分

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

UID
46577
好友
1
蛮牛币
2383
威望
0
注册时间
2014-9-24
在线时间
695 小时
最后登录
2017-9-21
发表于 2017-5-8 13:44:02 | 显示全部楼层
这个感觉很实用啊

回复 支持 反对

使用道具 举报

7日久生情
1775/5000
排名
17062
昨日变化
20

2

主题

1495

帖子

1775

积分

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

UID
185807
好友
0
蛮牛币
2365
威望
0
注册时间
2016-11-22
在线时间
254 小时
最后登录
2017-9-26
发表于 2017-5-8 14:32:35 | 显示全部楼层
6666666666666

回复

使用道具 举报

7日久生情
1775/5000
排名
17062
昨日变化
20

2

主题

1495

帖子

1775

积分

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

UID
185807
好友
0
蛮牛币
2365
威望
0
注册时间
2016-11-22
在线时间
254 小时
最后登录
2017-9-26
发表于 2017-5-8 21:03:36 | 显示全部楼层
赞,学习了,谢谢分享

回复 支持 反对

使用道具 举报

3偶尔光临
281/300
排名
10657
昨日变化
165

0

主题

195

帖子

281

积分

Rank: 3Rank: 3Rank: 3

UID
218160
好友
0
蛮牛币
584
威望
0
注册时间
2017-4-17
在线时间
20 小时
最后登录
2017-9-25
发表于 2017-5-8 21:13:53 | 显示全部楼层

谢谢分享!










回复 支持 反对

使用道具 举报

4四处流浪
385/500
排名
9236
昨日变化
11

0

主题

213

帖子

385

积分

Rank: 4

UID
146677
好友
7
蛮牛币
1888
威望
0
注册时间
2016-4-25
在线时间
86 小时
最后登录
2017-9-20
QQ
发表于 2017-5-9 09:06:04 | 显示全部楼层
好东西不错

回复

使用道具 举报

6蛮牛粉丝
1333/1500
排名
1654
昨日变化
8

1

主题

414

帖子

1333

积分

Rank: 6Rank: 6Rank: 6

UID
56496
好友
0
蛮牛币
3790
威望
0
注册时间
2014-11-19
在线时间
296 小时
最后登录
2017-9-26
发表于 2017-5-9 09:33:36 | 显示全部楼层
nice qingfeng346/ScorpioNet

回复 支持 反对

使用道具 举报

4四处流浪
411/500
排名
5331
昨日变化
2

2

主题

69

帖子

411

积分

Rank: 4

UID
177583
好友
0
蛮牛币
478
威望
0
注册时间
2016-10-22
在线时间
144 小时
最后登录
2017-9-23
发表于 2017-5-25 18:26:07 | 显示全部楼层
楼主牛逼啊,学习了

回复 支持 反对

使用道具 举报

4四处流浪
343/500
排名
24993
昨日变化
14

0

主题

40

帖子

343

积分

Rank: 4

UID
2235
好友
0
蛮牛币
185
威望
0
注册时间
2013-8-19
在线时间
293 小时
最后登录
2017-9-10

社区QQ达人

发表于 2017-6-3 10:52:40 | 显示全部楼层
Unity 简易 Socket库
[发帖际遇]: sou_su 在网吧通宵,花了 3 蛮牛币. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表