java服务器 protobuf_服务器端用PHP,客户端用JAVA,通过protobuf互相通信[原创] | 学步园...

我来记一下流水帐(仅实现“服务器端发送,客户端读取后显示”):

一、服务器端环境搭建(基于PHP)

1、服务器的搭建工作就略去了,列举一下环境版本如下:

PHP Version 5.3.2-1,Apache/2.2.14,Ubuntu10.04 LTS

2、由于google的protobuf官方仅支持三种语言,其中还还还就不包括PHP,只有下载第三方支持:

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官方版本

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;

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值