51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 3117|回复: 2
打印 上一主题 下一主题

游戏数据流 第2讲

[复制链接]
  • TA的每日心情

    2019-12-27 13:32
  • 签到天数: 15 天

    连续签到: 1 天

    [LV.4]测试营长

    跳转到指定楼层
    1#
    发表于 2018-7-4 16:45:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    游戏分为可靠数据流传输 和不可靠的数据流传输
    python语言的会和C++的比较像,node.js来说只要是对于库的选择

    了解选择的库
    tcp用网上或者自己封装处理二进制的bytebuffer的库+net库。
    udp用上前面一样的处理二进制的库+dgram。
    二进制处理的 -->https://github.com/play175/ByteBuffer  具体需要根据自己业务来修改。

    这里简单描述下关于udp的,拿的是官方的例子,改了下。
    常规做法 需要1个client端,1个服务端,自己和自己玩。先启动服务端bind后处理监听。客户端send消息,服务器recv消息后,打印在服务器本地或者应答
    客户端。
    客户端Buffer.alloc(n) n为占多少个字节但都是填充到0,拼接时会占字节长度,但是解包后没有具体内容。
    1. var dgram =require("dgram");
    2. var client =dgram.createSocket("udp4"); //服务端 ipv4这里修改  udp6就是ipv6
    3. var cmd =Buffer.alloc(1)
    4. var act =Buffer.alloc(1)
    5. var buf1 =Buffer.from("game")
    6. var buf2 =Buffer.from("数据报")
    7. var message = Buffer.from('game数据报');//1个中文3个字节 9个字节
    8. var ca =Buffer.concat([cmd,act,message]) //1个字节+1个字节+13个字节 1个中文3个字节
    9. dateChunks =[ca,buf1,buf2]
    10. client.send(dateChunks,40000,'localhost',function (error) {
    11.     console.log("客户端发送ca长度:%s和内存块长度:%s和内容:",ca.length,dateChunks.byteLength,dateChunks)
    12.     client.close();
    13. })
    复制代码
    Buffer.from(数组)传入是字符串,会把他内部转成1个数组list。具体请看dateChunks是1个[]类型,dataChunks内部进行了拼接。
    核心代码发送出去client.send(dataChunks,server_port,server_ip)
    client.close()代表发送后关闭。
    注意看dateChunks打印出来的是 其实是3个obj对象,因为对应dateChunks =[ca,buf1,buf2],这边打印出去的是[<Buffer 00 00 67 61 6d 65 e6 95 b0 e6 8d ae e6 8a a5>, <Buffer 67 61 6d 65>,<Buffer e6 95 b0 e6 8d ae e6 8a a5> ]是3个对象缓存二进制的列表。

    目前还不能运行,在建立1个服务端的代码,具体如下:

    1. var dgram =require("dgram");
    2. var socket =dgram.createSocket("udp4"); //服务端 udp4
    3. //地址族的ANY地址(IPv4'0.0.0.0'或IPv6'::')

    4. socket.on('listening',function () {
    5.     var address =socket.address();
    6.     console.log("服务器监听 %s:%s",address.address,address.port)
    7. })

    8. socket.bind(40000,function () {
    9.     socket.setMulticastInterface('10.0.0.2'); //ipv4 组织不匹配的接口,本地发送格式和这个匹配
    10. });//port未指定会是随机端口

    11. socket.on('error',function (error) {
    12.     console.log("服务器出现异常",error.stack)
    13.     server.close(callback());
    14. })


    15. socket.on("message",function (msg,rinfo) {
    16.     console.log("服务器收到msg-->%s,发送方的IP%s:端口%s",msg,rinfo.address,rinfo.port)
    17.     console.log("发送方过来数据报的大小:%s,地址类型:%s",rinfo.size,rinfo.family)
    18. })
    复制代码
    Node.js特性是要前后端几乎一致,所以客户端和服务端都要写dgram.createSocket。
    其他可以看注释。rinfo.address,rinfo.port来源的ip和端口,这个端口每次运行会变。rinfo.size是核心,和前面client里面传入的send(datachunks)的长度一致,单位是字节。
    bind对象后setMulticastInterface匹配 ipv4是用(0.0.0.0)  ipv6是(:的模式


    评分

    参与人数 1测试积点 +10 收起 理由
    lsekfe + 10 赞一个!

    查看全部评分

    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    该用户从未签到

    2#
    发表于 2018-7-5 09:04:12 | 只看该作者
    游戏怎么做接口测试,模拟各种类型数据
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2019-12-27 13:32
  • 签到天数: 15 天

    连续签到: 1 天

    [LV.4]测试营长

    3#
     楼主| 发表于 2018-8-31 17:57:00 | 只看该作者
    changliangbei 发表于 2018-7-5 09:04
    游戏怎么做接口测试,模拟各种类型数据

    你是说填写数据的参数吗。一样啊
    比如pb pb结构体解析出来后,会有各种类型的。
    生成的数据按这个数据类型写,不要超出长度就行。

    我的方式是 有个随机造数据的函数,第一个参数定义长度,0为null,第二个参数是定义数据类型的。
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-5-3 00:09 , Processed in 0.066586 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

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