国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
httpclient +protobuf 實(shí)現(xiàn)數(shù)據(jù)傳輸
最近項(xiàng)目要接入某聯(lián)盟廣告,采用protobuf作為傳輸協(xié)議,以前沒弄過,這次剛好使用到了,整理下
一、環(huán)境準(zhǔn)備:(mac下)
1.1 下載protobuf2.5安裝包
[html] view plain copy
http://pan.baidu.com/s/1o6v4Sae
1.2 解壓安裝包
[html] view plain copy
tar -zxf  protobuf-2.5.0.tar.gz
1.3 進(jìn)入軟件目錄
[html] view plain copy
cd protobuf-2.5.0
1.4 設(shè)置編譯目錄
[html] view plain copy
./configure --prefix=/User/jack/software/tools/protobuf
/User/jack/software/tools/protobuf  為自己設(shè)定的編譯安裝目錄
1.5 安裝
[html] view plain copy
make
make install
1.6 配置環(huán)境變量
[html] view plain copy
sudo vi .bash_profile
export PROTOBUF=/Users/jack/software/tools/protobuf
export PATH=$PROTOBUF/bin:$PATH
1.7 驗(yàn)證
[html] view plain copy
jack-3:bin jack$ protoc --version
libprotoc 2.5.0
二、代碼編寫
2.1 查看.proto文件,只貼出了部分文件內(nèi)容
[html] view plain copy
package mobads.apiv5;
// 本文件描述API接口版本:5.0.0
// 版本號信息
message Version {
optional uint32 major = 1[default = 0]; // 必填!
optional uint32 minor = 2[default = 0]; // 選填!
optional uint32 micro = 3[default = 0]; // 選填!
};
2.2 下載 protobuf-Java-2.5.0.jar
[html] view plain copy
http://download.csdn.net/download/zinc2008/8128155
2.3 生成.java文件
[html] view plain copy
protoc --java_out=./ baidu_mobads_api_5.0.proto
同樣只貼出部分java源文件 ( 注意java文件不要修改哦)
[html] view plain copy
// Generated by the protocol buffer compiler.  DO NOT EDIT!
// source: baidu_mobads_api_5.0.proto
package mobads.apiv5;
public final class BaiduMobadsApi50 {
private BaiduMobadsApi50() {}
}
2.4 代碼編寫,只貼出關(guān)鍵部分
[html] view plain copy
MobadsRequest adrequest = MobadsRequest.newBuilder().setRequestId(requestId).setAdslot(adslot).build();
byte[] content = adrequest.toByteArray();
HttpClient client = new HttpClient();
PostMethod postMethod = new PostMethod(URL);
postMethod.addRequestHeader("Content-Type", "application/octet-stream;charset=utf-8");
postMethod.setRequestEntity(new ByteArrayRequestEntity(content ));
client.executeMethod(postMethod);
注意content-type 設(shè)置為application/octet-stream。
到此,就完成了通過httpclient的post請求傳輸protobuf二進(jìn)制流。使用protobuf,所有的參數(shù)和返回都是對象的形式,這點(diǎn)還是用著比較爽的。
String byte 切換方法
服務(wù)端返回字符串
方式一:
[java] view plain copy
Arrays.toString(personInfo.toByteArray())
方式二:
[java] view plain copy
toByteString().toStringUtf8()
客戶端解析字符串
方式一:
[java] view plain copy
private static byte[] fromString(String string) {
String[] strings = string.replace("[", "").replace("]", "").split(", ");
byte[] result = new byte[strings.length];
for (int i = 0; i < result.length; i++) {
result[i] = Byte.parseByte(strings[i]);
}
return result;
}
XXX.parseFrom(fromString(byteString))
方式二:[java] view plain copy
XXX.parseFrom(ByteString.copyFromUtf8(utf8ByteString))
protobuf已經(jīng)出來好多年了,原諒我最近才了解到google這個高性能的用于傳輸?shù)母袷健?div style="height:15px;">
從各方面來看,它無論從序列化的性能還是從序列化的壓縮比都是優(yōu)于當(dāng)前各種傳輸格式的。如json、xml、hessian,java原生的Serializable。具體對比結(jié)果參見:http://agapple.iteye.com/blog/859052
網(wǎng)上也看了些資料,并有所了解,看了下,這玩意兒性能上來說真的沒什么可說,但初始化和使用的時候感覺不是特別方便。而且網(wǎng)上的例子多數(shù)都是序列化過程,沒有很多關(guān)于演示網(wǎng)絡(luò)傳輸?shù)膁emo,于是自己簡單寫了一個,將完整的例子擺在這里。
先定義一個Person.proto
Java代碼
option java_package = "com.example.protobuf";
option java_outer_classname = "PersonProbuf";
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
repeated PhoneNumber phone = 4;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
}
使用protoc生成對應(yīng)的PersonProtobuf類
Java代碼
protoc.exe Person.proto --java_out=.
請求客戶端代碼如下:
Java代碼
PersonProbuf.Person.Builder personRequest = PersonProbuf.Person.newBuilder();
personRequest.setId(1);
personRequest.setName("jesse");
personRequest.setEmail("xx@xx.com");
personRequest.addPhone(PersonProbuf.Person.PhoneNumber.newBuilder().setNumber("1234567890").setType(PersonProbuf.Person.PhoneType.HOME));
//使用java原生URL連接代碼生成請求并獲得返回值打印
URL url = new URL("http://localhost:90/protobuf.jsp");
URLConnection connection = url.openConnection();
connection.setDoOutput(true);
personRequest.build().writeTo(connection.getOutputStream());
PersonProbuf.Person personResponse = PersonProbuf.Person.parseFrom(connection.getInputStream());
System.out.println(personResponse.getId());
System.out.println(personResponse.getName());
System.out.println(personResponse.getEmail());
System.out.println(personResponse.getPhone(0));
System.out.println(personResponse.getPhone(1));
服務(wù)端protobuf.jsp代碼如下:
Java代碼
<%@ page pageEncoding="UTF-8"%>
<%@page import="com.example.protobuf.PersonProbuf"%>
<%
PersonProbuf.Person person = PersonProbuf.Person.parseFrom(request.getInputStream());
System.out.println(person.getId());
System.out.println(person.getName());
System.out.println(person.getEmail());
System.out.println(person.getPhone(0));
PersonProbuf.Person.Builder personBuilder = person.newBuilder(person);
personBuilder.setId(2);
personBuilder.setName("tiger");
personBuilder.setEmail("yy@yy.com");
personBuilder.addPhone(PersonProbuf.Person.PhoneNumber.newBuilder().setNumber("0987654321").setType(PersonProbuf.Person.PhoneType.HOME));
personBuilder.build().writeTo(response.getOutputStream());
%>
執(zhí)行客戶端代碼后,服務(wù)端/客戶端輸出:
Java代碼
------服務(wù)端輸出------
1
jesse
xx@xx.com
number: "1234567890"
type: HOME
------客戶端輸出------
2
tiger
yy@yy.com
number: "1234567890"
type: HOME
number: "0987654321"
type: MOBILE
所以protobuf只是一種序列化的格式,并不是傳輸協(xié)議,需要傳輸?shù)?,只要使用輸入輸出流,就可以做任何保存,傳輸?shù)牟僮鳌?div style="height:15px;">
另外百度寫了個jprotobuf開源,使用起來挺方便,只要使用注解放在javabean上就可以了
github:https://github.com/jhunters/jprotobuf
不過這個開源工具對集合沒有適合的注解,而且也沒有說明和其他語言傳輸?shù)臅r候,如何保證一致性,所以需要使用的人考慮清楚,需要慎用。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服