jiazurongyu 发表于 2018-7-4 16:45:03

游戏数据流 第2讲

游戏分为可靠数据流传输 和不可靠的数据流传输
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,拼接时会占字节长度,但是解包后没有具体内容。
var dgram =require("dgram");
var client =dgram.createSocket("udp4"); //服务端 ipv4这里修改udp6就是ipv6
var cmd =Buffer.alloc(1)
var act =Buffer.alloc(1)
var buf1 =Buffer.from("game")
var buf2 =Buffer.from("数据报")
var message = Buffer.from('game数据报');//1个中文3个字节 9个字节
var ca =Buffer.concat() //1个字节+1个字节+13个字节 1个中文3个字节
dateChunks =
client.send(dateChunks,40000,'localhost',function (error) {
    console.log("客户端发送ca长度:%s和内存块长度:%s和内容:",ca.length,dateChunks.byteLength,dateChunks)
    client.close();
})Buffer.from(数组)传入是字符串,会把他内部转成1个数组list。具体请看dateChunks是1个[]类型,dataChunks内部进行了拼接。
核心代码发送出去client.send(dataChunks,server_port,server_ip)
client.close()代表发送后关闭。
注意看dateChunks打印出来的是 其实是3个obj对象,因为对应dateChunks =,这边打印出去的是[<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个服务端的代码,具体如下:

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

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

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

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


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


changliangbei 发表于 2018-7-5 09:04:12

游戏怎么做接口测试,模拟各种类型数据

jiazurongyu 发表于 2018-8-31 17:57:00

changliangbei 发表于 2018-7-5 09:04
游戏怎么做接口测试,模拟各种类型数据

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

我的方式是 有个随机造数据的函数,第一个参数定义长度,0为null,第二个参数是定义数据类型的。
页: [1]
查看完整版本: 游戏数据流 第2讲