我来记一下流水帐(仅实现“服务器端发送,客户端读取后显示”):
一、服务器端环境搭建(基于PHP)
1、服务器的搭建工作就略去了,列举一下环境版本如下:
PHP Version 5.3.2-1,Apache/2.2.14,Ubuntu10.04 LTS
2、由于google的protobuf官方仅支持三种语言,其中还还还就不包括PHP,只有下载第三方支持:
http://code.google.com/p/pb4php/
3、解压zip包到/var/www/protocolbuf
---------->>>>>>是的,你没看错,这就完事儿了,done了,只要您的PHP工作没问题,protobuf的PHP版环境就搭好了。
二、客户端环境搭建(基于JAVA)
1、操作系统我用的是Ubuntu 10.04 LTS
2、当然得装好JAVA和ECLIPSE
Version: Helios Service Release 1,java-6-sun-1.6.0.24
3、下载protobuf官方版本
http://code.google.com/p/protobuf/downloads/list
4、解压缩到某个路径,比如~/protobuf里面
5、按照~/protobuf/INSTALL.txt里面的指示,分三步编译protobuf(别忘了,如果没有C++支持,可以apt-get install g++的)
进入到~/protobuf中,先后执行make, make check, make install
6、注意,编译好的protoc是在/usr/local/bin里面的,这一点可以通过/usr/local/bin/protoc --version来和你下载的zip文件标示的版本号对比来验证
7、如果出现错如“error while loading shared libraries: libprotobuf.so.7: cannot open shared object file: No such file or directory”,其实是没有能够在/usr/lib里面找到这个文件,其实在/usr/local/lib里面是有的,我们建立一个软连接就可以了“sudo ln -s /usr/local/lib/libprotobuf.so.7.0.0 /usr/lib/libprotobuf.so.7"
三、服务器端、客户端测试代码
1、先说客户端的
编辑自己的proto文件,比如pictures_protos.proto,进到pictures_protos.proto所在的目录,用下面的指令编译之
/usr/local/bin/protc -I=./ --java_out=./ pictures_protos.proto
pictures_protos.proto
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
package test.protos;
message Picture {
required string filename = 1;
required string relpath = 2;
required int32 clicks = 3;
}
message Pictures {
repeated Picture pic = 1;
}
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
test.java
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
......
URLConnection conn = getConnection("http://localhost/protobuftest.php");
try {
conn.connect();
InputStream is = conn.getInputStream();
Pictures urlPics = Pictures.parseFrom(is);
for (Picture urlPic: urlPics.getPicList()) {
System.out.println("filename:" + urlPic.getFilename());
System.out.println("relpath:" + urlPic.getRelpath());
System.out.println("clicks:" + urlPic.getClicks());
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
......
public URLConnection getConnection(String sUrl) {
URL url = null;
try {
url = new URL(sUrl);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
System.out.println("DEBUGTAG " + "Remtoe Image Exception" + e.toString());
e.printStackTrace();
return null;
}
URLConnection conn = null;
try {
conn = url.openConnection();
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("DEBUGTAG " + "Remtoe Image Exception" + e.toString());
e.printStackTrace();
return null;
}
try {
conn.connect();
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("DEBUGTAG " + "Remtoe Image Exception" + e.toString());
e.printStackTrace();
return null;
}
return conn;
}
......
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
2、再说服务器端的
我们注意到test.java里面要访问一个叫做protobuftest.php的页面,这个php文件是这么来的:
首先在/var/www/protocolbuf/parser/下面创建一个firstparser.php,然后把pictures_protos.proto文件copy到某一目录,比如就是firstparser.php的这个目录,为的是需要修改pictures_protos.proto才能正常编译,因为用php版编译时不支持package关键字,我们得注释掉;然后执行php firstparser.php,在同一目录下就会生成pb_proto_pictures_protos.php;最后我们就可以在/var/www下面创建一个protobuftest.php用来和客户端通信了。
firstparser.php
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
require_once("./pb_parser.php");
$parser = new PBParser();
$parser->parse("./pictures_protos.proto");
echo "done/n";
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
protobuftest.php
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
require_once("./protocolbuf/message/pb_message.php");
require_once("./protocolbuf/parser/pb_proto_pictures_protos.php");
$pics = new Pictures();
$pic = $pics->add_pic();
$pic->set_filename("fn01");
$pic->set_relpath("rp01");
$pic->set_clicks(1);
$pic = $pics->add_pic();
$pic->set_filename("fn02");
$pic->set_relpath("rp02");
$pic->set_clicks(2);
$pic = $pics->add_pic();
$pic->set_filename("fn03");
$pic->set_relpath("rp03");
$pic->set_clicks(3);
$pic = $pics->add_pic();
$pic->set_filename("文件名04");
$pic->set_relpath("路径名04");
$pic->set_clicks(4);
$pic = $pics->add_pic();
$pic->set_filename("文件名05");
$pic->set_relpath("路径名05");
$pic->set_clicks(5);
$pic = $pics->add_pic();
$pic->set_filename("fn06");
$pic->set_relpath("rp06");
$pic->set_clicks(6);
$pic = $pics->add_pic();
$pic->set_filename("fn07");
$pic->set_relpath("rp07");
$pic->set_clicks(7);
$string = $pics->SerializeToString();
echo $string;
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<