go的go protobuff这个问题是不是一个bug

Apache Camel: Protobuf
&&&&&&&&&&&&
Protobuf - Protocol Buffers
"Protocol Buffers - Google's data interchange format"
Camel provides a
to serialse between Java and the Protocol Buffer protocol.
The project's site details why you may wish to .
Protocol Buffer is language-neutral and platform-neutral, so messages produced by your Camel routes may be consumed by other language implementations.
Protobuf overview
This quick overview of how to use Protobuf. For more detail see the
Defining the proto format
The first step is to define the format for the body of your exchange.
This is defined in a .proto file as so:
Generating Java classes
The Protobuf SDK provides a compiler which will generate the Java classes for the format we defined in our .proto file.
You can run the compiler for any additional supported languages you require.
protoc --java_out=. ./addressbook.proto
This will generate a single Java class named AddressBookProtos which contains inner classes for Person and AddressBook.
Builders are also implemented for you.
The generated classes implement com.google.protobuf.Message which is required by the serialisation mechanism.
For this reason it important that only these classes are used in the body of your exchanges.
Camel will throw an exception on route creation if you attempt to tell the
to use a class that does not implement com.google.protobuf.Message.
Use the generated builders to translate the data from any of your existing domain classes.
You can use create the ProtobufDataFormat instance and pass it to Camel DataFormat marshal and unmarsha API like this.
Or use the DSL protobuf() passing the unmarshal default instance or default instance class name like this.
Spring DSL
The following example shows how to use Castor to unmarshal using Spring configuring the protobuf data type
Dependencies
To use Protobuf in your camel routes you need to add the a dependency on camel-protobuf which implements this data format.
If you use maven you could just add the following to your pom.xml, substituting the version number for the latest & greatest release (see ).
The Apache Software Foundation.
Apache Camel, Camel, Apache, the Apache feather logo, and the Apache Camel project logo are trademarks of The Apache Software Foundation.
All other marks mentioned may be trademarks or registered trademarks of their respective owners.数据交换利器 Protobuf 技术浅析_教育指南_百度教育攻略
由于最近公司采用protocol buffer(以下简称protobuf)来作为不同应用之间的数据交换,故最近一段时间研究了protobuf相关技术。在这里分享下。protobuf是什么?protobuf是google旗下的一款平台无关,语言无关,可扩展的序列化结构数据格式。所以很适合用做数据存储和作为不同应用,不同语言之间相互通信的数据交换格式,只要实现相同的协议格式即同一proto文件被编译成不同的语言版本,加入到各自的工程中去。这样不同语言就可以解析其他语言通过protobuf序列化的数据。目前官网提供了C++,Python,JAVA,GO等语言的支持。精彩内容,尽在百度攻略:protobuf 语法定义要想使用protobuf必须得先定义proto文件。所以得先熟悉protobuf的消息定义的相关语法。下面就来介绍首先我们先定义一个proto文件,结构如下:精彩内容,尽在百度攻略:上面我们主要定义了一个消息,这个消息包括文章ID,文章摘要,文章图片。下面给出消息定义的相关说明当然protobuf支持更多的类型,比如bool,double,float,枚举,也可以是其他定义过的消息类型譬如前面的消息Article。支持的基本类型如下:精彩内容,尽在百度攻略:下面让我们定义一个数据比较多的article.proto文件来再次说明下proto语法的相关内容,起码通过列子可以更直观的感受。上面proto文件,我们定义了enum枚举类型,嵌套的消息。甚至对原有的消息进行了扩展,也可以对字段设置默认值。添加注释等此外reserved关键字主要用于保留相关编号标签,主要是防止在更新proto文件删除了某些字段,而未来的使用者定义新的字段时重新使用了该编号标签。这会引起一些问题在获取老版本的消息时,譬如数据冲突,隐藏的一些bug等。所以一定要用reserved标记这些编号标签以保证不会被使用精彩内容,尽在百度攻略:当我们需要对消息进行扩展的时候,我们可以用extensions关键字来定义一些编号标签供第三方扩展。这样的好处是不需要修改原来的消息格式。就像上面proto文件,我们用extend关键字来扩展。只要扩展的字段编号标签在extensions定义的范围里。对于基本数值类型,由于历史原因,不能被protobuf更有效的encode。所以在新的代码中使用packed=true可以更加有效率的encode。注意packed只能用于repeated 数值类型的字段。不能用于string类型的字段。在消息Other中我们看到定义了一个oneof关键字。这个关键字作用比较有意思。当你设置了oneof里某个成员值时,它会自动清除掉oneof里的其他成员,也就是说同一时刻oneof里只有一个成员有效。这常用于你有许多optional字段时但同一时刻只能使用其中一个,就可以用oneof来加强这种效果。但需要注意的是oneof里的字段不能用required,optional,repeted关键字精彩内容,尽在百度攻略:一般在我们的项目中肯定会有很多消息类型。我们总不能都定义在一个文件中。当一个proto文件需要另一个proto文件的时候,我们可以通过import导入,就像下面这样:protobuf也提供了包的定义,只要在文件开头定义package关键字即可。主要是为了防止命名冲突,不过对于Python语言在编译的时候会忽略包名。很多时候我们会修改更新我们定义的proto文件,如果不遵守一定规则的话,修改的后proto文件可能会引发许多异常。在官网上对更新proto有以下几点要求精彩内容,尽在百度攻略:ptotobuf语法相对比较简单,一般都能很快熟悉上手。这里只是粗浅的介绍下,更多详细内容可以参考/protocol-buffers/docs/proto。proto文件编译现在我们有了proto文件,需要把它编译成我们需要的语言,这里以python为例。通过以下命令生成我们需要的python代码,你会发现目录多了一个article_pb2.py的文件。精彩内容,尽在百度攻略:-I 指定搜索proto文件的目录,这里指定为当前目录。-I 也可以写成 –proto_path–python_out 会将生成的python代码文件放到等号后面指定的目录,这里也指定当前目录。如果需要生成其他语言的代码譬如java换成–java_out即可。这里提供一个官网提供的模版,如下最后指定我们要编译的proto文件。精彩内容,尽在百度攻略:现在我们有了编译后的article_pb2.py,加入到我们的项目中去该怎么用呢?这个时候就需要用到google提供的protobuf python API。 下面我们通过例子来简单介绍下API的使用protobuf python api的使用直接贴代码来看,详细的说明都在注释里。主要的SerializeToString和ParseFromString2个方法。一个序列化,一个反序列化。精彩内容,尽在百度攻略:以上主要是通过python来操作protobuf序列化的数据,我们也可以将序列化后的数据通过网络发给其他应用。通过protobuf序列化的数据体量更小,传递效率相比于XML,JSON效率会更高。其他应用也不需要是python,可以是java,c++。只要实现了相同的proto协议,就可以解析发送过来的序列化数据。以上就是本人对protobuf的理解,有不当之处还请指出,谢谢!打赏支持我写出更多好文章,谢谢!任选一种支付方式精彩内容,尽在百度攻略:679被浏览87881分享邀请回答ASP.NET的时候就体验到的,当然跟Erlang的速错不完全一致,那时候也没有那么高大上的一个名字,但是对待异常的理念是一样的。在.NET项目开发的时候,有经验的程序员都应该知道,不能随便re-throw,就是catch错误再抛出,原因是异常的第一现场会被破坏,堆栈跟踪信息会丢失,因为外部最后拿到异常的堆栈跟踪信息,是最后那次throw的异常的堆栈跟踪信息;其次,不能随便try catch,随便catch很容易导出异常暴露不出来,升级为更严重的业务漏洞。到了Erlang时期,大家学到了速错概念,简单来讲就是:让它挂。只有挂了你才会第一时间知道错误,但是Erlang的挂,只是Erlang进程的异常退出,不会导致整个Erlang节点退出,所以它挂的影响层面比较低。在Go语言项目中,虽然有类似Erlang进程的Goroutine,但是Goroutine如果panic了,并且没有recover,那么整个Go进程就会异常退出。所以我们在Go语言项目中要应用速错的设计理念,就要对Goroutine做一定的管理。在我们的游戏服务端项目中,我把Goroutine按挂掉后的结果分为两类:1、挂掉后不影响其他业务或功能的;2、挂掉后业务就无法正常进行的。第一类Goroutine典型的有:处理各个玩家请求的Goroutine,因为每个玩家连接各自有一个Goroutine,所以挂掉了只会影响单个玩家,不会影响整体业务进行。第二类Goroutine典型的有:数据库同步用的Goroutine,如果它挂了,数据就无法同步到数据库,游戏如果继续运行下去只会导致数据回档,还不如让整个游戏都异常退出。这样一分类,就可以比较清楚哪些Goroutine该做recover处理,哪些不该做recover处理了。那么在做recover处理时,要怎样才能尽量保留第一现场来帮组开发者排查问题原因呢?我们项目中通常是会在最外层的recover中把错误和堆栈跟踪信息记进日志,同时把关键的业务信息,比如:用户ID、来源IP、请求数据等也一起记录进去。为此,我们还特地设计了一个库,用来格式化输出堆栈跟踪信息和对象信息,项目地址:通篇写下来发现比我预期的长很多,所以这里我做一下归纳总结,帮组大家理解这篇文章所要表达的:错误和异常需要分类和管理,不能一概而论错误和异常的分类可以以是否终止业务过程作为标准错误是业务过程的一部分,异常不是不要随便捕获异常,更不要随便捕获再重新抛出异常Go语言项目需要把Goroutine分为两类,区别处理异常在捕获到异常时,需要尽可能的保留第一现场的关键数据以上仅为一家之言,抛砖引玉,希望对大家有所帮助。2018 条评论分享收藏感谢收起201 条评论分享收藏感谢收起mac 下配置 protobuf golang插件 并使用 - 简书
mac 下配置 protobuf golang插件 并使用
Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准
Protocol Buffers 是一种轻便高效的结构化数据存储格式
可以用于结构化数据串行化,或者说序列化。
它很适合做数据存储或 RPC 数据交换格式。
可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。
支持语言很多,C++ java python php golang 等,支持列表
C++ (include C++ runtime and protoc)
Objective-C
JavaScript
protobuf 3.0
与 之前的 protobuf 2.6 的语法是不一样的
安装 ProtoBuf
# 查看protobuf信息
brew info protobuf
brew install protobuf
# 检查安装结果
protoc --version
libprotoc 2.6.1
Linux 请查询 apt-get or yum
安装 3.0 版本
因为3.0在开发中,不能直接使用brew安装稳定版
可以选择让brew安装开发版
可以选择编译安装开发版本,编译过程需要自备梯子
brew tap 安装
~ brew tap homebrew/versions
~ brew info protobuf
protobuf: stable 3.0.2 (bottled), HEAD
Protocol buffers (Google's data interchange format)
/google/protobuf/
/usr/local/Cellar/protobuf/2.6.1 (121 files, 6.9M) *
Poured from bottle on
at 12:08:43
From: /Homebrew/homebrew-core/blob/master/Formula/protobuf.rb
==& Dependencies
Build: autoconf ?, automake ?, libtool ?
==& Options
Build using C++11 mode
--universal
Build a universal binary
--with-test
Run build-time check
--without-python
Build without python support
Install HEAD version
==& Caveats
Editor support and examples have been installed to:
/usr/local/Cellar/protobuf/3.0.2/share/doc/protobuf
~brew install protobuf
因为3.0在开发中,不能直接使用brew安装,需要编译,编译过程需要自备梯子
编译过程需要 gtest
brew info automake
brew info libtool
# 没有这两个就安装
./autogen.sh
# 检查没问题了
./configure
make check
make install
检查安装结果
安装golang for protobuf插件
go get -u -/golang/protobuf/proto
go get -u -/golang/protobuf/protoc-gen-go
请将你的$GOPATH/bin 设置为环境变量,这样才可以使用protoc-gen-go
使用protobuf
说明:本用例是在protobuf version 2.6.1中执行
编写 proto 文件
使用文本编辑器编辑文件 Im.helloworld.proto,内容为
请认真对待 proto 文件的文件名,常用规则packageName.MessageName.proto
package Im;
enum FOO { X = 17; };
message helloworld
required int32
required string
optional int32
// Opt optional field
解释这个文本
package 名字叫做 Im
定义了一个消息 helloworld
该消息有三个成员,类型为 int32 的 id,另一个为类型为 string 的成员 str。opt 是一个可选的成员,即消息中可以不包含该成员
编译 .proto 文件
protoc --go_out=. Im.helloworld.proto
# 编译当前目录下所有的proto文件
protoc --go_out=. *.proto
出现错误提示,请检查上面的安装过程
生成的文件为 Im.helloworld.pb.go
内容主体有
FOO_X FOO = 17
type Helloworld struct {
`protobuf:"varint,1,req,name=id" json:"id,omitempty"`
*string `protobuf:"bytes,2,req,name=str" json:"str,omitempty"`
`protobuf:"varint,3,opt,name=opt" json:"opt,omitempty"`
XXX_unrecognized []byte
`json:"-"`
测试这个生成代码
编写测试代码
package main
"/golang/protobuf/proto"
func main() {
// 创建一个消息 Info
info := &example.Helloworld{
Id: proto.String("hello"),
Str: proto.Int32(17),
// 进行编码
data, err := proto.Marshal(info)
if err != nil {
fmt.Printf("marshaling error: ", err)
// 进行解码
newInfo := &example.Helloworld{}
err = proto.Unmarshal(data, newInfo)
if err != nil {
fmt.Printf("unmarshaling error: ", err)
if info.GetId() != newInfo.GetId() {
fmt.Printf("data mismatch %q != %q", info.GetId(), newInfo.GetId())
测试运行一下,如果出现问题或者代码有误,请自行解决一下~~
Nothing is a line of code can not be resolved, if have just use two lines on !
没有什么是一行代码不能解决的,如果有就两行
Context /sinlov
转自:/Program/IOS/001.shtml 首先是怎么安装Protobuf。 来自/alexeyxo/protobuf-objc的文档。 打开终端! brew -v 查看你的m...
从Protocol Buffers 到 gRPC 标签: ProtoBuf gRPC HTTP/2 我们项目中准备使用Protocol Buffers来进行服务器和客户端的消息交互,采用gRPC开源框架,服务器使用Java,客户端有Android和iOS。 [TOC] 一、...
由于工程项目中拟采用一种简便高效的数据交换格式,百度了一下发现除了采用 xml、JSON 还有 ProtoBuf(Google 出品),赶紧去瞄了一下。花了一个周末的时间把它走马观花的学习了一下,顺便将官方的指南翻译了出来。 首先申明,哥们儿英语高中水平,借助了必应词典勉强...
Protocol Buffers 是 Google 出品的用来序列化/反序列化数据的工具。原生支持 C++、Java、Python。 如果要在 iOS 上使用 PB,可以直接使用 C++,但是编译过程很麻烦,因此这里使用的是第三方的库。 安装 Protocol Buffer...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金相信有很多朋友...
课程即将结束,下周的现在我终于不用天天来回跑了。办辅导班一个月,有得有失。差不多有一个月没写文章了,因为我找了一个非常棒的借口,每日教学生,太累太辛苦。其实真实的原因是我懒得去写,懒得去想,懒得去做。 说说我的收获 与家长沟通,与学生交流,与房东切磋,与时间赛跑。沟通增进家...
炉火待纯青,诸法空相是。无智亦无得,名菩提萨缍。非人众寿者,假立虚拟之。时空隧道兮,见相无痕时
1,在你的面前男人不会私藏秘密,男人在你的面前就像是透明的一样,他的事情开心的快乐的,烦恼的,郁闷的只要是他的事情,只要你愿意听,他会把他所有的事情都告诉你,你就是他心灵的寄托,他所有的秘密都不会躲着你。 2,你所说的每一句话他都记在脑袋里,印在心里,不管你是发脾气,还是吐...
#幸福是需要修出来的~每天进步1%~幸福实修08班~14-申屠枫艳-富阳# /99) 【幸福三朵玫瑰】 昨日2朵玫瑰 去杭州? 打电话去防保所? 今日3朵玫瑰 做早餐 阅读 去图书馆还书 【幸福实修99天目标】 幸福实修打卡 每天走路半小时 和孩子一起...
活着好累,好多不如意go 不能发送udp广播,这算不算是一个bug? - Golang中国
17:47 发布 1792 次点击
net.Dial(“udp”, “255.255.255.255:8888”)
win下和centos下都测试了,局域网广播始终没有任何数据返回
package main
func main() {
go func() {
server, _ := net.ListenPacket(&udp&, &:8888&)
fmt.Println(&server ip:&, server.LocalAddr().String(), &
&, server.LocalAddr().Network())
_buff := make([]byte, 8192)
_count, _addr, _ := server.ReadFrom(_buff)
fmt.Println(&upd ip:&, _addr.String(), &
&, _addr.Network())
fmt.Println(&package length:&, _count)
fmt.Println(&content:&, string(_buff[0:_count]))
_wc, _err_w := server.WriteTo([]byte(&ok&), _addr)
if _err_w != nil {
panic(_err_w)
fmt.Println(&write count:&, _wc)
time.Sleep(time.Second * 2)
//_radd, _ := net.ResolveUDPAddr(&udp&, &127.0.0.1:8888&)
更换为这个是单播,结果是正常的
_radd, _ := net.ResolveUDPAddr(&udp&, &255.255.255.255:8888&)
_udp, _err_udp := net.DialUDP(&udp&, nil, _radd)
if _err_udp != nil {
panic(_err_udp)
_udp.SetDeadline(time.Now().Add(time.Second * 3))
_, _err_write := _udp.Write([]byte(&test&))
if _err_write != nil {
panic(_err_write)
_buff := make([]byte, 8192)
_count, _err_read := _udp.Read(_buff)
if _err_read != nil {
panic(_err_read)
fmt.Println(&read result:&, string(_buff[:_count]))
leronpror 于
20:49 修改
有测试吗?能收到回复吗?
你完整的代码呢,我项目就是用udp发通知啊
我用wireshark试了一下,广播包确实是发出去了,可能因为包发出去的,所以在本机接收不到。
我用wireshark试了一下,广播包确实是发出去了,可能因为包发出去的,所以在本机接收不到。
发出去是可以的,但是接不到回复,java是可以的,而且人家还是跑在虚拟机上的.
是的啊,网卡向外发一个广播包,又不是接收一个广播包,所以本机收不到啊。
我的意思是网卡只是向别人发了一个包,自己不会收到这个广播包。
广播的消息是要经过自己的回环的
确实,广播的消息是要经过自己的回环的,本机广播,本机也可以收到,不过记得把防火墙关了,允许你监听的端口,可以用telnet测试
后方可回复, 如果你还没有账号你可以
一个帐号。}

我要回帖

更多关于 go语言protobuf 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信