go的go protobuf windows这个问题是不是一个bug

First of all, protobuf is an open source project (the official site in the &here&), but the background is very hard for open source projects. Most of the existing Internet (at least 80%) open source project, or is someone going it alone, or a fe
本篇文章是对Protobuf C++ serialize到char*的实现方法进行了详细的分析介绍.需要的朋友参考下 protobuf的Demo程序是 C++版本的protubuf有几种serialize和unSerialize的方法: 方法一: 官方demo程序采用的是 // Write the new address book back to disk. fstream output(argv[1], ios::out | ios::trunc | ios::binary); if (!ad
作者:祝兴昌 百度质量部 protocol buffers[1]是google提供的一种将结构化数据进行序列化和反序列化的方法,其优点是语言中立,平台中立,可扩展性好,目前在google内部大量用于数据存储,通讯协议等方面.PB在功能上类似XML,但是序列化后的数据更小,解析更快,使用上更简单.用户只要按照proto语法在.proto文件中定义好数据的结构,就可以使用PB提供的工具(protoc)自动生成处理数据的代码,使用这些代码就能在程序中方便的通过各种数据流读写数据.PB目前支持Java,
protobuf相当xml作用,但是比xml更加灵活,而且解析起了比xml方便,速度快 第一步我们可以要protobuf的jar包 高手可以自己下载源码打jar包,菜鸟直接上网上下载个现成的jar(嘿嘿~我就是在网上直接下载的jar) 把jar包导入到项目里面 在上官网下载对应的protoc.exe编译工具,copy到项目的src目录下 把.proto文件放到src目录下 例如: addressbook.pr option java_package =
1.先从/p/protobuf-csharp-port/网站下载protobuf-csharp-port包,我下载的版本是:protobuf-csharp-port-2.4.1.473-release-binaries. 2.将上述包解压缩之后,取出其中的ProtoGen.exe.config,protoc.exe,ProtoGen.exe及Google.ProtocolBuffers.dll文件放到D:\protoc文件夹里 (D:\protoc文件
写在之前: 安装 eclipse 的 protobuf-dt 插件,具体见 /p/protobuf-dt/wiki/Installing 我在安装第一个插件 Xtext 的时候遇到各种问题,索性直接在 eclipse marketplace 搜索 install 设置编译器 protoc.exe 的路径 1.创建一个工程,并引入protobuf 的 java 包 mvn archetype:create -Dgroup=com.coffee -Dart
protobuf实例-PHP版 protobuf简介 protobuf是google提供的一个开源序列化框架,类似于XML,JSON这样的数据表示语言,其最大的特点是基于二进制,因此比传统的XML表示高效短小得多.虽然是二进制数据格式,但并没有因此变得复杂,开发人员通过按照一定的语法定义结构化的消息格式,然后送给命令行工具,工具将自动生成相关的类,可以支持php.java.c++.python等语言环境.通过将这些类包含在项目中,可以很轻松的调用相关方法来完成业务消息的序列化与反序列化工作. p
Protobuf 是Google发布的开源编码规范, 官方支持C++/Java/Python等几种语言. Go语言发布之后, Go的官方团队发布的GoProtobuf也实现了Protobuf支持. 不过GoProtobuf官方版本并没有实现rpc的支持. protoc-gen-go 甚至连 service 的接口也未生成. 如果看过 &JSON-RPC: a tale of interfaces& 文章, 会发现Go语言支持rpc非常容易. 我们现在就开始尝试给GoProtobuf增加
写了一个简单的网络通信程序. 客户端向服务端发送一串字符串,服务端计算出字符串长度返回.功能很简单 客户端和服务端通信采用protobuf 客户端每次发送的长度是一定的,包括发送的整个长度,字符串和crc校验码 服务端返回的长度也是一定的,包括客户端发送的字符串长度和crc校验码 服务端和客户端做了简单的超时控制和容错处理. 贴代码: protobuf定义: 1 message CliPack { 2 required int32 length = 1; 3 required string da
Redis的当前数据存储在内存中,由于内存并不象硬盘一样有着很大的空间,对于服务器来说一般只会提供16G或32G内存.所以让Redis使用这些内存存储更多的数据是比较重要的.在使用redis的samples中一般都是使用string,而对象则用json方式来存储.但显然json所占用的空间是比较大的,在实际业务中一般对象成员都定义得比较长,而这些往往占用着很多空间:还有就是json对于数字的存储也是以字符方式表过,无法象二进制存储那样节省空间. 其实在对象写入redis的时候可以采用一些更节省空
Protobuf非常适合处理对象数据在网络方面通讯,所以Beetle.NetPackage加入了对Protobuf的支持,提供支持的平台有android和windows phone 8. android mClient =new NetClient(&10.0.2.2&, 9088, new ProtoPackage(), this); mClient.Connect(); Register.Builder builder = Register.newBuilder(); builde
Protobuf的设计非常适用于在网络通讯中的数据载体,它序列化出来的数据量少再加上以K-V的方式来存储数据,对消息的版本兼容性非常强:还有一个比较大的优点就是有着很多的语言平台支持.下面讲解一下如何在TCP通讯应用中集成Protobuf. Protobuf提供一种简单的对象消息方式来描述数据的存储,通过相关实现可以简单地实现数据流和对象之间的转换.但由于Protobuf序列化后的信息并不包括一些相应对象类型描述,只有消息体的内容:因此在进行通信交互过程中默认情况是不知道这些数据和对象的对应关系
网络通信涉及到消息的定义,不管是使用二进制模式.xml.json等格式.消息都可以大体的分为 命令消息.请求消息.应答消息和指示消息4大消息类型.一般情况下每个消息还还有包含一个序列号和一个能够唯一区分类型类型的消息编号,编号可以使用字符串.整数或者枚举等. 1. 使用 protobuf 的enum定于消息的编号,也就是消息的类型. 我会为每个系统都定义一个MSG枚举.包含系统用到的所有消息的枚举编号 enum MSG { Login_Request = 0x; Login_Re
在新版本的Beetle.NetPackage开源组件中集成了对Protobuf的支持,在android下可以简单地使用Beetle.NetPackage实现基于Protobuf的TCP通讯数据交互.下详细讲解实现一个网络订单管理功能的过程. 协议定义 既然使用Probobuf进行数据交互,那就需要基于Protobuf制定一系列的通信对象,主要包括数据请求和应答的数据对象格式.在做之前需要把需求整理一下明确一下有那些功能,由于Demo主要是用于介绍一下protobuf在Beetle.NetPack
1.概述. protobuf,作为网络通信时的消息载体,不仅效率高,而且还加快开发进度,减少BUG. 但是protobuf消息生成的类,不管是C++\Java还是其他第三方支持的语言C#等生成的消息类,都不太适合用于业务逻辑处理(没有100%的不行,如果非要使用message类作为业务逻辑对象,那么耦合性就太高了,当然类似于C#这种提供partial类的功能是没有问题的).因此很多时候,我们都需要重复定义至少一份业务逻辑对象,至少是客户端和服务器各一份.那么就涉及到这么业务逻辑对象和protob
高效的.可扩展的对结构化数据进行编码的格式规范 下面介绍的是使用Java ProtoBuf的基本步骤: 1./p/protobuf/downloads/list ,选择其中的win版本下载 2.下载一个protobuf-java-2.4.1.jar文件(注意,要与你刚才下的proto.exe版本相同,否则可能出现编译通不过现象) /snapshot/repo1.maven.org/maven2/com.google
1.下载pbc项目 /miaodadao/pbc 2.proto生成pb文件 /p/protobuf/downloads/list 下载protoc文件,然后切换到上面下载完成后解压的文件下调用下面安装命令 ./configure --prefix=/usr/local/protobuf make make check make install 安装完成后在存放proto的文件下调用 protoc -- descr
本机是windows环境 1. 下载 protobuf最新版本:/p/protobuf/downloads/detail?name=protobuf-2.5.0.tar.gz 2. 解压后发现没有包.java下面只有一个POM.xml. 用maven吧.(mvn3的环境自己上网找吧) 3. cmd进入protobuf-2.5.0\java\ 运行 mvn package 发现错误: Java代码 [ERROR] Failed to execute g
前两天想在微博上发表一个观点:在现在的技术体系中,能用于描述通讯协议的方式很多,xml,json,protobuf,thrift,如果在有如此众多选择的基础上,在设计系统时,还自造协议,自己设计协议类型和解析方式,那么我只能说,您真的落后了,不是技术上,而是思想上.对于xml,和json我们不做过多描述了,参考相关文档就可以了.特别是json,如今在 web系统,页游系统的前后台通讯中,应用非常广泛.本文将重点介绍两种目前在大型系统中,应用比较普遍的两种通讯框架,thrift和Protobuf,
cocos2dx提供三方的iconv来转化字符问题,交叉编译到android的时候,需要引入iconv的module,下载iconv, /u//iconv.zip 解压到cocos2d根目录 ,编写mk: proto作为游戏中的传输协议一部分是相当的有用(注意将mk,config.h放在同一目录).版本2.5.0 protobuf库: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS)
1.首先为 聊天服务器(Chat)定义google protobuf的协议接口文件 接口主要遵循 Request.Response.Notification(Indication),Command(本文未出现)四大消息分类,并且使用Message顶层消息把Request.Response,Notification等包含起来:并定义一个MSG枚举值,用于表示具体的消息值(在google protobuf RPC过程中,其实 每个service方法就是一个Request和Response的应答对,只
一直想在项目中用上protobuf,但是2个游戏做上了确一直没用上,最近刚好比较空闲,整一个例子玩玩. 1.准备:netty3.5.2 ,protobuf2.5.0 pom.xml如下: &dependency& &groupId&com.google.protobuf&/groupId& &artifactId&protobuf-java&/artifactId& &version&2.5.0&/version& &lt
Netty with protobuf 这是一篇关于netty和protobuf的文章,先来介绍一下protobuf的简单使用.网上有很多基本的protobuf的介绍,这里就不在赘述了. protobuf官网上提供了一个例子,我们就拿那个例子来改造: proto文件描述了消息的结构,这个文件时这样的 option java_package = &com.example.tutorial&; option java_outer_classname =
/xinxingegeya/blog/295031 上一篇了解了protobuf,现在结合netty做一个例子. 关键就是配置netty的编解码器,因为netty提供了protobuf的编解码器,所以我们可以很容易的使用netty提供的编解码器使用protobuf数据交换协议进行通信.. 下面是示例代码,对于了解的netty的同学应该不难看懂. 服务器端程序: ProtobufNettyServer.java package com.example
xocde6编译 :http://blog.csdn.net/xiaofei125145/article/details/(实践 成功编译 protobuff 2.6.0,注意ios平台官方引用了protobuf,所以在对应的common.h #define google google_private) 处理方案参考1:http://blog.csdn.net/maxway/article/details/ 处理方案参考2:http://blog.csdn.net
上一篇中大概描述了c++ java中关于protobuf反序列化对象实体和实体处理(函数)关系,并贴出了java的实现方案,针对c++版本也只是简单的描述了一下 采用std::bind().这里采用 id+ 指针,通过ID索引到指针,利用多态性来处理. 由于c++ 不像java可以有反射,所以这里实例化引用直接用静态的指针.交给编译器处理 在静态的区来开辟储存.大概实现如下: 基类,所有的处理函数controller均实现该类: #ifndef __BaseController__ #defin
我的开发环境是Win7 64JDK 1.7:protobuf-2.5.0-win32; 如摘要所言,我下载的是win32的protoc.exe,网上找了一圈都没有win 64bit的版本. 测试生成Java文件失败,截图如下: 这是书上的方式,但是是失败的执行,因为作者没有说清楚,protoc是按照:protoc input output 来编译的.所以,cmd执行命令报Missing input file错误. 先来看下我的.proto文件的定义: SubscribeReq.pro
网上看了一些资料但还是遇到不少问题.在这里记录一下 下载地址: /sean-lin/protoc-gen-lua.git 1. 复制文件 protoc-gen-lua/protobuf/pb.c 到 frameworks\cocos2d-x\external\lua\protobuf\pb.c 2. 修改 frameworks\cocos2d-x\cocos\scripting\lua-bindings\manual\network\lua_extension
Last week with the redis, protobuf implements a lightweight mq. The process of trying to use a spring-data-redis, currently 1.0.0.2.M2-SNAPSHOT version, looks like a version before release. Advantage 1. Redis java client currently have more than one:
windows-------------------------------------------------------------------------------- 1.下载 protoc.exe 2. 安装proto的go语言插件 go get /p/goprotobuf/{proto,protoc-gen-go} 3. message RegMessage { required int32 id = 1; // 主键
/shrimps/archive//1327988.html Recently the hands of the project need to select a configuration information is saved the program, now on the XML, JSON, Protocol Buffer (hereinafter referred to as PB), Lua do a horizont
&classpathentry kind=&src& path=&packages/apps/AlarmClock/src&/& &classpathentry kind=&src& path=&out/target/common/obj/APPS/Launcher2_intermediates/src&/& &classpathentry kind=&src& path=&q
HDFS + MapReduce + Hive + HBase 10 minutes quick start Yi Jian
1. Introduction The purpose of this paper is to never touch a person Hadoop in a very short time, ease of use, master compile, install and simple to use. 2. Hadoop family 2009-8
So filled with countless nosql the world, voldemort as a member of Nosql. Simple test the next 'health status' background: currently LinkIn use similar ideas with the Dynamo 1. Read and write performance. read 10s 100000 writer 15s 1000000 Performanc
Android 2.1 Source Structure Analysis Rockie Cheng Android 2.1 | - Makefile | - Bionic (bionic C Library) | - Bootable (boot-related code) | - Build (compile rules and generic storage systems and other infrastructure development package configuration
Android 2.1 source directory structure of (turn) Author Rockie Cheng Android 2.1 | - Makefile | - Bionic (bionic C Library) | - Bootable (boot-related code) | - Build (compile rules and generic storage systems and other infrastructure development pac
Android 2.1 | - Makefile | - bionic (bionic C Library) | - bootable (boot-related code) | - build (compile rules and generic storage systems and other infrastructure development package configuration) | - cts (Android compatibility test suite standar
1: Windows source code under the download android Technology → → Android mobile development program based on android development) First of all, to /p/msysgit/downloads/list download Git-***. exe, I downloaded the Git-1.6. 2.2-pr
Android 2.1 | - Makefile | - Bionic (bionic C Library) | - Bootable (boot-related code) | - Build (compile rules and generic storage systems and other infrastructure development package configuration) | - Cts (Android compatibility test kit standard)
Almost every Web developer has their own favorite database or the database they are most familiar with, but the most common is nothing less than the following: MySQL PostgreSQL MSSQL SQLite MS Access Or more simple XML, text files and so on. The data
The following is reproduced: Android 2.1 Source Structure Analysis Rockie Cheng Android 2.1 | - Makefile | - Bionic (bionic C Library) | - Bootable (boot-related code) | - Build (compile rules and generic storage systems and other infrastructure deve
How to effectively control the power consumption problem? First, we take a look at Android phones are mainly consumed in the power where: Obviously, most of the electricity are consumed in the network connection, GPS, sensors on the. Simply put, that
ganglia: performance monitoring software behind the Wikipedia address RPC (Remote Procedure Call Protocol) - Remote Procedure Call protocol which is
google using a protoBuf
provided by google Android Android includes the original target machine code, the host compiler tools, simulation environment, through the decompression code package, the first-level directories and files as follows: | - Makefile (global Makefile) |
Android application must access in the Internet, data, and Internet data can have several different formats. This article describes how to use Android application of three data formats: XML JSON Google's protocol buffers First, develop a Web service,
Before the article: Provide stock data Application server needs to be able to do two things. First, it must obtain a list of stock code and retrieve their data. Then, it needs to accept a format parameter and based on the format of encoded data. For
Connected to the articles: Protocol buffers are Google developed a language-independent data serialization format than XML to transfer data through the network faster. It is used for server to server calls Google the de facto standard. Google and use
Android 2.1 Source Structure Analysis Android 2.1 | - Makefile | - Bionic (bionic C Library) | - Bootable (boot-related code) | - Build (compile rules and generic storage systems and other infrastructure development kit configuration) | - Cts (Androi
Language Guide Defining A Message Type Scalar Value Types Optional And Default Values Enumerations Using Other Message Types Nested Types Updating A Message Type Extensions Packages Defining Services Options Generating Your Classes This guide describ
Protocol Buffer Basics: C + + This tutorial provides a basic C + + programmer's introduction to working with protocol buffers. By walking through creating a simple example application, it shows you how to Define message formats in a .proto file. Use
Copyright (C) , All Rights Reserved.
版权所有 闽ICP备号
processed in 0.059 (s). 9 q(s)运用google-protobuf的IM消息应用开发
运用google-protobuf的IM消息应用开发
前言:公司原本使用了第三方提供的IM消息系统,随着业务发展需要,三方的服务有限,并且出现问题也很难处理和排查,所以这次新版本迭代,我们的server同事呕心沥血做了一个新的IM消息系统,我们也因此配合做了一些事情。 对于前端来说,被告知需要用到protocol buffer,什么gui?最开始我一直没弄懂到底是个什么东西,感觉和平时接触的技术差别比较大。 还有二进制什么的,以前感觉从来就没在前端使用过。 久经波折,这次的旅途学到了很多东西,所以作此博客。protocol buffer:简称protobuf,google开源项目,是一种数据交换的格式,google 提供了多种语言的实现:php、JavaScript、java、c#、c++、go 和 python等。 由于它是一种二进制的格式,比使用 xml, json 进行数据交换快许多。以上描述太官方不好理解,通俗点来解释一下,就是通过protobuf定义好数据结构生成一个工具类,这个工具类可以把数据封装成二进制数据来进行传输,在另一端收到二进制数据再用工具类解析成正常的数据。为什么用protobuf(以下是后端大大“邱桑”的意思):优:1.json占用流量大,用了protobuf的二进制传输会帮助传输更轻量,节约用户和服务端流量 。之前旧消息系统使用json的时候发现,当一台服务器访问量很大的时候,cpu占用很低,但是带宽已经满了,服务器承载量也就满了。2.json太随意太灵活了,字段想加就加,PM提的需求后来维护的人不考虑什么就加上去, 搞乱架构,用protobuf,一看到这东西,就会谨慎。3.生成代码对于除了javascript来说的其它语言,真的就是福利,用json的话,后端要写好多类,去把对象解析到类上,然后遇到有子对象,还要再解析,都是体力活,传上来一个protobuf,后端拿到就可以decode了,不用再关心类型,不用再去挨个判断做解析,很开心啊,另外,虽然php也是弱类型,拿到json也可以decode成数组或stdClass,但那个没有意义,不是具体的业务实体, 代码依旧很难维护。(对于JavaScript这样的语言来说,确实不是福利,用json会更好操作,引入编译和解析二进制数据不仅增加了工作量,还要对protobuf生成的js再次做一次封装方便业务开发,加大了业务复杂度)4.有一定安全性, 传输过程中是二进制,抓包是看不出具体数据的,并且是自己定义protobuf生成的代码,才能正确解析出数据(有点类似于对称加密)。 前端代码压缩过,即便想通过前端来看懂,也比较费劲,只能说比一般的json安全性高一些。劣:1.可读性比较差,需要通过工具来解析2.对于JavaScript,没有json友好,会增加解析和封装的工作量。使用protobuf:对于web前端来说,用它主要是能为用户节约流量,但是业务代码变得多了一层,会复杂一点,但是确实对传输性能做了很大提升。下面我们来看看大致的使用流程。使用protobuf,你需要安装protobuf编译器,然后通过.proto文件配置自定义的数据格式,如下代码(person.proto):message Person { required string name = 1; required int32 id = 2; optional string email = 3; }定义了人的类,有三个描述变量。通过protobuf编译器,把当前配置的类编译成你所需要语言的代码。 比如编译成JavaScript,这个时候会生成一个js文件,我们重命名就叫person.js吧,里面的代码依赖google-protobuf,所以我们要先npm google-protobuf,然后通过webpack或者browserify之类的打包工具把 google-protobuf 引入到当前 person.js 中,最后再引入到我们的工程中。定义的person,前端要使用的话大致代码如下://封装 var person = new proto.protocal.P person.setName('子慕'); person.setId('1'); person.setEmail(''); var binary = person.serializeB //解析 var person= new proto.protocal.Person.deserializeBinary(unit8array); var obj = { name: person.getN id: person.getId; email: person.getE }前端通过websocket拿到后端下行的arrayBuffer对象,把它转化成unit8array,Person的deserializeBinary方法就能把二进制解析成Person对象,可以通过get+变量命拿到相应值。 serializeBinary方法可以直接把当前的对象转换成二进制数据,用于发送到另一端。但是,这样就显得非常难以使用了,甚至数据类型很多,结构也都不一样,如果每次收发一个消息都要这样去处理的话,太麻烦了。这里需要进行一层封装处理,方便业务使用,封装后使用大概如下代码://我们封装生成的对象假比就叫ImInstance //发送时候直接写一个json,会自动封装 ImInstance.send({ person:{ id: '1', name: '子慕', email: '' } }) //接收也会自动,解析 var msg= ImInstance.parse(arrayBuffer);//{person:{name:'x',id:'x',email:'xxx'}}假如我们后端是php,前端是web,protobuf生成一个两个语言的工具类,相互通信都要通过各自的类解析和封装,如下图:实际是我们会有三个前端:长连接:一个消息系统是需要长连接的,前端需要随时接收消息,APP使用了tcp长连接,前端就是websocket了。 websocket也是基于tcp的,相当于在tcp基础上封装了一层。 某种程度来说tcp的性能优于websocket,因为websocket就是在tcp的基础上多了一层转化,但是websocket使用更简单,用tcp的app端需要自己去读tcp流,根据包头和包体组装数据包,而websocket不需要,因为websocket会是一帧一帧的数据。 具体来说,后端通过缓存区把数据冲刷(flush)给前端,app端拿到tcp数据流,需要根据消息头给定的消息体长度,去拿取后面多少位的数据,然后组装成一个数据包。 而websocket传输过来就是一个个的包,也就是帧并不是数据流,所以后端在给websocket数据的时候,必须要把一个整包,在缓冲区一次性冲刷过来,而给tcp的话就可以自由冲刷。ArrayBuffer:前端也许很少会接触到二进制,至少我没怎么接触过。 之前说的二进制传输,通过设置websocket 的 binaryType = 'arraybuffer',消息下行的时候 onmessage 拿到的 MessageEvent.data 会是一个ArrayBuffer对象,如图:关于ArrayBuffer,MDN解释: ArrayBuffer对象被用来表示一个通用的,固定长度的二进制数据缓冲区。你不能直接操纵ArrayBuffer的内容;相反,你应该创建一个表示特定格式的buffer的类型化数组对象(typed array objects)或数据视图对象DataView来对buffer的内容进行读取和写入操作。类型化数组(typed array objects)有下图这些类型:实际就是一个ArrayBuffer我们是不能直接操作它的,需要转成可以操作的对象类型,我们是需要转换成Unit8Array,比如这样:var unit8= new Uint8Array(arrayBuffer);但是我发现在微信里这样用会报错,在手机默认的浏览器里还是好的,看来还存在一定兼容问题。后来用到DataView才没问题的:var dataview = new DataView(arrayBuffer); var unit8= new Uint8Array(dataview.buffer, dataview.byteOffset, dataview.byteLength);兼容问题不止这一点,在phone5测试的时候,一直有问题(同事说那台手机被苹果封过,不晓得会不会和这个有关系),一步步查下去,发现是Unit8Array一些方法在phone5里显示undefined,比如 Unit8Array.slice 和 Unit8Array.from,把 Unit8Array.slice用 Unit8Array.subarray 替换,Unit8Array.from 用 new 替换,像这样:Uint8Array.from([1, 0, 0]) == new Uint8Array([1, 0, 0]),目前来说就没出现其他兼容问题了。websocket和重连机制:我们会封装一个独立的websocket类,处理websocket的建立、连接、重连、心跳、监听等,提供一些钩子函数,配合前面说的ImInstance实现业务功能。长连接肯定是会出现断开或者弱网等一系类情况,保证业务的健壮和稳定性,需要做心跳重连。这块之前的博客已经写过,这次项目之后又对代码和博客进行了一些完善,具体可以看之前的博客《初探和实现websocket心跳重连》和心跳的github源码《/zimv/WebSocketHeartBeat》。一些踩到的坑汇总:下面两个问题有一个知识点: Number类型统一按浮点数处理,64位(bit)存储,整数是按最大54位(bit)来算最大最小数的,否则会丧失精度;某些操作(如数组索引还有位操作)是按32位处理的。1.位移运算:每一条消息有个唯一id,id是根据时间戳加上一些其他参数再通过位移运算得出的。 本身根据id可以得出时间,所以就没有专门给时间的字段,这里就需要前端对id进行一次运算,得出时间,但是我在做位移操作的时候发现得出的值不对。 后来才查到了上面的知识点。 server给我们的是64位的int,但是js的位移是按照32位处理的,所以得出的值不对,后来邱桑找到了一个Long.js库,它可以把64位整数拆分成两个32位的去计算,最后我就得到了正确的时间。Long.js2.number丢失精度:因为js的整数最大只支持到54bit,范围在 0992 到 0992,而我们的id是超过了54bit的(这一点受到了后端同事的疯狂嘲笑)。 在做消息回执(收到一条消息,发送当前消息的id给后端,告知我收到这个消息了)的时候,因为超过了js的最大值,所以前端传出去的id就会是错误的。 比如后端返回了一个id为111111的值(18个1),前端通过protobuf类解析之后拿到的值直接变成了个1加2个0),因为超过了最大值,js用0来占位显示,这样回执给后端的id就是111100了。 我以为当前存放数字的变量就已经是这个值了,我不管做什么都没用了,那么我希望后端给我一个字符串的id我才好处理(发现这个问题的时候项目正在准备上线),但是邱桑觉得这样多一个字段太浪费。 后来他查了一些资料告诉我,就用Long.js,它可以帮我转换成正确的字符串,我不信,我认为js存不到那么大的数据,js直接把数据给丢失了,而邱桑说值实际还在内存里精度没有丢失,只是js展示不出来,而且非常肯定,我当时不信,在他强烈的要求下,我使用了Long.js的转换方法,结果他是对的。 虽然收到的值超过了js的范围,但是数值仍然是原封不动的在内存里,这个也是被狠狠的打了一下脸,果然还是邱桑厉害! Long.js的代码量还是比较多,当时我想我只用位移就把位移的相关代码抽出来整合了一下,这样比较节约。 后来发现我现在说的这个问题也需要用到Long.js的其它方法,我又尝试抽离,发现要抽的代码太多了,后来干脆就直接把Long.js全部引入进来了(装逼失败)。3.微信localstorage:官方说退出微信账号后,将会清空所有Cookie和localStorage。 网上有人说还有部分机型据说会出现无法存储或者退出webview之后就会被清除(这个没有亲自做验证)。 那么我需要做的未读消息状态就没法保证在任何情况下都能正确存取。 解决方案是后端提供一个可以读取的接口,我去存取一个key和value,自己来维护状态。 在h5做未读消息状态还真不容易,我需要在接收到消息的时候做一个判断,如果当前用户没有在和某一个人的对话页面,那么这个人的消息肯定是未读的,我需要总未读计数+1,和这个人的未读计数+1,当进到某个人的会话页面,这个人的未读数将被清空,第一次登陆之后还会拉取离线消息,然后把离线消息的整理一下做次统计,每次未读消息出现变更都需要把之前的数据进行对比并且更新,页面跳转或者未读出现变化的时候需要给底部tab和消息列表dom做一次状态更新。给一个静态图,看下效果:4.websocket断线重连把自己踢下线的问题:我们会避免用户重复登录websocket,如果当前用户第二次连接websocket的话 会把上一次登录的一端给踢下线,被踢下线的一端会收到一个消息,当收到踢下线的消息之后我便不会进行重连。 因为网络原因、异常原因或者后端主动要求我重连,我便会去进行重连,但是有时候出现就在同一个地方执行了重复连接,实际都是自己这一个端,那么就会出现登录上之后,又收到踢下去的消息,把自己给踢下去了,踢下去就不会再重连了,这样就永久断开了,这属于逻辑没控制好。 解决这个问题是首先要保证重连之前先主动对当前的websocket执行一次close,close的时候后端是会收到断开的通知,这样我们再去连接就不会重复登录了。结语:这次自己碰到很多不熟悉的知识,也问了server同事很多问题,学到很多,有靠谱的大牛同事就是爽! 也出过一些bug和问题,多次反复追溯才查出问题的根源,有时候1个bug可能是几个地方代码写错造成的问题。 第一个版本已经顺利上线,后面还有很多重要的工作要做,单从前端来说,还需要把封装的websocket和ImInstance写得更好,文档,扩展性这些都要考虑(已经是一个公共类了,以后还会作为sdk开放给三方平台);还需要做一个监控展示,帮助实时监控服务器CPU,带宽,性能等。 经历了一次大版本的迭代,加了一个月的班,熬了几天夜,和团队一起在进步,收获到这么多经验包也是很开心的。
本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。
百家号 最近更新:
简介: 展现宇宙万象,普及科学知识。
作者最新文章

我要回帖

更多关于 go protobuf repeated 的文章

 

随机推荐