TA的每日心情 | 怒 2019-12-27 13:32 |
---|
签到天数: 15 天 连续签到: 1 天 [LV.4]测试营长
|
游戏分为可靠数据流传输 和不可靠的数据流传输
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([cmd,act,message]) //1个字节+1个字节+13个字节 1个中文3个字节
- dateChunks =[ca,buf1,buf2]
- 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 =[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个服务端的代码,具体如下:
- 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是(:的模式
|
评分
-
查看全部评分
|