欢迎来到天天文库
浏览记录
ID:39467585
大小:201.50 KB
页数:14页
时间:2019-07-04
《Protobuf使用例子》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Protobuf使用例子1.protobuf使用整理protobuf序列化反序列化的一种解决方案,protobuf处理成二进制数据流,相比较xml/json更加节省数据流量。protobuf是google提出的解决方案,有比较多的互联网公司采用此种解决方案,protobuf只支持java/python/php支持语言相对比较少。protobuf提供了protobuf-java-xx.jar工具包处理,要求开发者定义.proto文件,然后进行执行编译成对应语言版本的源文件,比如java是编译生成.java源文件。1
2、.1.proto文件编写Protobuf中的proto文件编写,比如定义一个HelloWorld.proto文件//HelloWorld.proto文件为://定义生成java文件所在的包名optionjava_package="com.helloworld.protocol";//生成对应外部类名称optionjava_outer_classname="HelloWorldProtoc";messageHelloWorld{//定义必须属性,类型为int32requiredint32num=1;//定义可选属性
3、,类型为int64optionalint64num2=2;//定义可选属性,类型为stringoptionalstringinfo=3;//定义为list,list里边item类型为stringrepeatedstringmobileList=4;//定义枚举类型,设定default默认值为MALEoptionalSexTypesexType=5[default=MALE];//定义一个message对象optionalHelloWorldExtextInfo=6;enumSexType{MALE=0;//0-男
4、性FEMALE=1;//1-女性UNKNOWN=2;//2-未知}messageHelloWorldExt{requiredint32num=1;optionalint64num2=2;optionalstringinfo=3;}}1.1.执行生成java文件下载到protobuf生成exe文件,名称为:protoc.exe可执行文件编写生成.java文件脚本为:gen-test.bat内容为:protoc--java_out=./HelloWorld.protopause生成.java文件放在当前目录下的com
5、/helloworld/protocol文件夹目录下若在client端-server端开发过程中,比如客户端使用的是Android开发,则可以将生成的protocol源文件拷贝给客户端开发了。通过HelloWorldProtoc文件进行数据携带传输。1.2.通过socket进行通信下载官方提供的protobuf-java.xx.jar包,然后就可以进行开发工作了,简单采用socket进行处理client端请求,server端进行应答处理。处理过程为:Client发出请求>>>用HelloWorldProto进行携
6、带数据,转换成二进制数据流Server端接收请求>>>反序列化>>>对象>>>序列化>>>传输回给客户端代码压缩包为://HelloWorldClient.java文件为:publicclassHelloWorldClient{privatefinalstaticStringHOST_NAME="localhost";privatefinalstaticintPORT=8080;publicstaticvoidmain(String[]args){Socketsocket=null;InputStreamins=
7、null;OutputStreamous=null;try{socket=newSocket(HOST_NAME,PORT);socket.setKeepAlive(true);socket.setSoTimeout(10000);ous=socket.getOutputStream();ins=socket.getInputStream();HelloWorld.Builderbuilder=HelloWorld.newBuilder();builder.setNum(1);builder.setNum2(2L
8、);HelloWorldExt.BuilderextBuilder=HelloWorldExt.newBuilder();extBuilder.setInfo("helloworldext");extBuilder.setNum(1);extBuilder.setNum2(2L);builder.setExtInfo(extBuilder.build());//先写len
此文档下载收益归作者所有