结合服务端和客户端使用protobuf
来源:互联网 发布:js判断是否等于0 编辑:程序博客网 时间:2024/06/05 12:49
前段页面引入这三个文件,主要用来按照protobuf buffer协议解编码protobuf数据。
<script src="../protobuf/long.js"></script><script src="../protobuf/bytebuffer.js"></script><script src="../protobuf/protobuf.js"></script>
先写一份说明书-proto文件,test.protobuf
package TestProtobuf;option java_package = "com.why.game.protobuf";option java_outer_classname = "TestProtobuf";message TestProto{ optional int32 id = 1; optional string name = 2;}使用库文件加载这个proto文件
var ProtoBuf = dcodeIO.ProtoBuf;var TestProtobuf = ProtoBuf.loadProtoFile("test.proto").build("TestProtobuf");
//的到里面的messagevar TestProto = TestProtobuf.TestProto;用ajax发送/接收protobuf:
xhr.onreadystatechange = function(){ if (xhr.readyState == 4 && xhr.status == 200) { var data = xhr.responseText;
//解码protobuf var protobufResp = TestProto.decode(str2bytes(data)); var jsonResp = JSON.stringify(protobufResp); console.log(jsonResp); }};//实例化一个TestProtovar testProto = new TestProto({ id:10014, name:"testProtoName测试987"});
//编码发送xhr.send(testProto.toBuffer())
使用XMLHttpRequest对象的send方法发送经由TestProto编码(encode)后的buffer数组(本质也是二进制字节流),
接收的时候同样使用TestProto解码(decode)接收到的二进制数据
这里因为浏览器会把Ajax返回的二进制数据当做文本数据,所以写个str2bytes方法把接收到的文本数据按字节一个个做与运算来还原成二进制byte
function str2bytes(str){ var bytes = []; for (var i = 0, len = str.length; i < len; ++i) { var c = str.charCodeAt(i); var byte = c & 0xff; bytes.push(byte); } return bytes;}
----------------------------------------------------------分割线-----------------------------------------------------------------------------
使用socketio:
客户端
<script type="text/javascript" src="socket.io.js"></script>//写个example.proto
//注意这个message是关键字
message Message { required string text = 1;}
//客户端js
var ProtoBuf = dcodeIO.ProtoBuf;var Message = ProtoBuf.loadProtoFile("./example.proto").build("Message");var log = {value:''}// socket链接服务器var socket = io.connect("http://localhost:3000");socket.on("connect", function () { log.value += "Connected\n";});socket.on("disconnect", function () { log.value += "Disconnected\n";});socket.on("message", function (message) { try{//解析服务端数据 var msg = Message.decode(message); log.value += "Received: " + msg.text + "\n"; }catch(err){ log.value += "Error: " + err + "\n"; }});function send() { if (socket.connected) {//向服务端发送数据 var msg = new Message({text:3}); socket.send(msg.toBuffer()); log.value += "Sent: " + msg.text + "\n"; } else { log.value += "Not connected\n"; }}
//服务端nodejs部分:
同样需要
protobufjs
var server = http.createServer(function(request, response){ var filePath = false; if(request.url == "/"){ filePath = "index.html"; }else if(request.method === "POST"){ if(request.url.indexOf("protobuf") != -1){ //BufferHelper参考链接 http://www.infoq.com/cn/articles/nodejs-about-buffer/ var bufferHelper = new BufferHelper(); request.on("data", function (chunk) { bufferHelper.concat(chunk); }); request.on("end", function () { var buffer = bufferHelper.toBuffer(); var testProtoData = TestProto.decode(buffer); response.writeHead(200, {"Content-Type": "application/x-protobuf"}); response.end(testProtoData.toBuffer()); }); } return; }else{ filePath = request.url; } var absPath = webRoot+filePath; serveStatic(response, cache, absPath);});
var ProtoBuf = require("protobufjs");var socketio = require("socket.io");// Initialize from .proto filevar builder = ProtoBuf.loadProtoFile(path.join(__dirname, "www", "example.proto")), Message = builder.build("Message");// SocketIO adaptervar io = socketio.listen(server);io.set("log level", 1);io.sockets.on("connection", function(socket){ console.log(socket.id+" connecting..."); socket.on("disconnect", function() { console.log("WebSocket disconnected"); }); socket.on("message", function(data) { try { // Decode the Message var msg = Message.decode(data); console.log("Received: "+msg.text); // Transform the text to upper case msg.text = msg.text.toUpperCase(); // Re-encode it and send it back socket.send(msg.toBuffer()); //socket.emit('message', msg.toBuffer()); console.log("Sent: "+msg.text); } catch (err) { console.log("Processing failed:", err); } });});ok
阅读全文
0 0
- 结合服务端和客户端使用protobuf
- Unity3D客户端和Java服务端使用Protobuf
- Unity3D客户端和Java服务端使用Protobuf
- Unity3D客户端和Java服务端使用Protobuf
- SuperSocket与Netty之实现protobuf协议,包括服务端和客户端
- svn 服务端和客户端的使用
- TCP:客户端和服务端的使用实例
- 使用java6开发WebService服务端和客户端
- WebService--使用Axis2创建服务端和客户端
- 使用openssl编写服务端和客户端程序
- Android Socket 使用(客户端和服务端)
- XMLRPC 服务端和客户端的JAVA使用
- sVN服务端和客户端使用教程总结
- 使用axis2生成webservice服务端和客户端
- 使用openssl编写服务端和客户端程序
- webservice结合CXF服务端及客户端开发
- 服务端和客户端
- XMPP 客户端和服务端
- c++ c 基础的总结(-)
- Ubuntu apache2 虚拟主机配置
- 再见阿里云,你好腾讯云
- java多线程
- 《C++ Primer》读书笔记第四章-2-类型转换
- 结合服务端和客户端使用protobuf
- webpack2.0搭建react框架环境
- 基础算法回顾
- 有关Java反射机制的作用及用法浅析
- 35. Search Insert Position
- Python入门(一) 安装python+pycharm
- 如何在JS页面中引入时间插件(简单时间)
- 异常
- ARM微处理器系列简介