现在的位置: 首页 > 综合 > 正文

服务器端用PHP,客户端用JAVA,通过protobuf互相通信[原创]

2013年09月06日 ⁄ 综合 ⁄ 共 4618字 ⁄ 字号 评论关闭

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

一、服务器端环境搭建(基于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;

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

抱歉!评论已关闭.