httpclient +protobuf 实现数据传输_httpclient 调用 protocol buffer协议接口(2)

12 篇文章 0 订阅
12 篇文章 0 订阅

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

[html] 
view plain
 copy

  1. protoc --java_out=./ baidu_mobads_api_5.0.proto

同样只贴出部分java源文件 ( 注意java文件不要修改哦)

[html] 
view plain
 copy

  1. // Generated by the protocol buffer compiler.  DO NOT EDIT!
  2. // source: baidu_mobads_api_5.0.proto
  3. package mobads.apiv5;
  4. public final class BaiduMobadsApi50 {
  5. private BaiduMobadsApi50() {}
  6. }

2.4 代码编写,只贴出关键部分

[html] 
view plain
 copy

  1. MobadsRequest adrequest = MobadsRequest.newBuilder().setRequestId(requestId).setAdslot(adslot).build();
  2. byte[] content = adrequest.toByteArray();
  3. HttpClient client = new HttpClient();
  4. PostMethod postMethod = new PostMethod(URL);
  5. postMethod.addRequestHeader(“Content-Type”, “application/octet-stream;charset=utf-8”);
  6. postMethod.setRequestEntity(new ByteArrayRequestEntity(content ));
  7. client.executeMethod(postMethod);

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注意content-type 设置为
application/octet-stream。

到此,就完成了通过httpclient的post请求传输protobuf二进制流。
使用protobuf,所有的参数和返回都是对象的形式,这点还是用着比较爽的。

String byte 切换方法

服务端返回字符串

方式一:

[java] 
view plain
 copy

  1. Arrays.toString(personInfo.toByteArray())

方式二:

[java] 
view plain
 copy

  1. toByteString().toStringUtf8()

客户端解析字符串

方式一:

[java] 
view plain
 copy

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. private static byte[] fromString(String string) {
  2. String[] strings = string.replace(“[”, “”).replace(“]”, “”).split(", ");
  3. byte[] result = new byte[strings.length];
  4. for (int i = 0; i < result.length; i++) {
  5. result[i] = Byte.parseByte(strings[i]);
  6. }
  7. return result;
  8. }
  9. XXX.parseFrom(fromString(byteString))

方式二:

[java] 
view plain
 copy

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. XXX.parseFrom(ByteString.copyFromUtf8(utf8ByteString))

protobuf已经出来好多年了,原谅我最近才了解到google这个高性能的用于传输的格式。

从各方面来看,它无论从序列化的性能还是从序列化的压缩比都是优于当前各种传输格式的。如json、xml、hessian,java原生的Serializable。具体对比结果参见:http://agapple.iteye.com/blog/859052

网上也看了些资料,并有所了解,看了下,这玩意儿性能上来说真的没什么可说,但初始化和使用的时候感觉不是特别方便。而且网上的例子多数都是序列化过程,没有很多关于演示网络传输的demo,于是自己简单写了一个,将完整的例子摆在这里。

先定义一个Person.proto

Java代码  
收藏代码

  1. option java_package = “com.example.protobuf”;
  2. option java_outer_classname = “PersonProbuf”;
  3. message Person {
  4. required string name = 1;
  5. required int32 id = 2;
  6. optional string email = 3;
  7. repeated PhoneNumber phone = 4;
  8. enum PhoneType {
  9. MOBILE = 0;
  10. HOME = 1;
  11. WORK = 2;
  12. }
  13. message PhoneNumber {
  14. required string number = 1;
  15. optional PhoneType type = 2 [default = HOME];
  16. }
  17. }

使用protoc生成对应的PersonProtobuf类

Java代码  
收藏代码

  1. protoc.exe Person.proto --java_out=.

请求客户端代码如下:

Java代码  
收藏代码

  1. PersonProbuf.Person.Builder personRequest = PersonProbuf.Person.newBuilder();
  2. personRequest.setId(1);
  3. personRequest.setName(“jesse”);
  4. personRequest.setEmail(“xx@xx.com”);
  5. personRequest.addPhone(PersonProbuf.Person.PhoneNumber.newBuilder().setNumber(“1234567890”).setType(PersonProbuf.Person.PhoneType.HOME));
  6. //使用java原生URL连接代码生成请求并获得返回值打印
  7. URL url = new URL(“http://localhost:90/protobuf.jsp”);
  8. URLConnection connection = url.openConnection();
  9. connection.setDoOutput(true);
  10. personRequest.build().writeTo(connection.getOutputStream());
  11. PersonProbuf.Person personResponse = PersonProbuf.Person.parseFrom(connection.getInputStream());
  12. System.out.println(personResponse.getId());
  13. System.out.println(personResponse.getName());
  14. System.out.println(personResponse.getEmail());
  15. System.out.println(personResponse.getPhone(0));
  16. System.out.println(personResponse.getPhone(1));

服务端protobuf.jsp代码如下:

Java代码  
收藏代码

  1. <%@ page pageEncoding=“UTF-8”%>
  2. <%@page import=“com.example.protobuf.PersonProbuf”%>
  3. <%
  4. PersonProbuf.Person person = PersonProbuf.Person.parseFrom(request.getInputStream());
  5. System.out.println(person.getId());
  6. System.out.println(person.getName());
  7. System.out.println(person.getEmail());
  8. System.out.println(person.getPhone(0));
  9. PersonProbuf.Person.Builder personBuilder = person.newBuilder(person);
  10. personBuilder.setId(2);
  11. personBuilder.setName(“tiger”);
  12. personBuilder.setEmail(“yy@yy.com”);
  13. personBuilder.addPhone(PersonProbuf.Person.PhoneNumber.newBuilder().setNumber(“0987654321”).setType(PersonProbuf.Person.PhoneType.HOME));
  14. personBuilder.build().writeTo(response.getOutputStream());
  15. %>

执行客户端代码后,服务端/客户端输出:

Java代码  
收藏代码

  1. ------服务端输出------
  2. 1
  3. jesse
  4. xx@xx.com
  5. number: “1234567890”
  6. type: HOME
  7. ------客户端输出------
  8. 2
  9. tiger
  10. yy@yy.com
  11. number: “1234567890”
  12. type: HOME

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  1. 2
  2. tiger
  3. yy@yy.com
  4. number: “1234567890”
  5. type: HOME

[外链图片转存中…(img-BK8CnSZp-1715903330605)]
[外链图片转存中…(img-QoSQC8UG-1715903330605)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 17
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值