Protocol Buffer使用实例

来源:互联网 发布:通达信选股源码 编辑:程序博客网 时间:2024/06/06 05:41

1、安装说明

     点击下载protocol相关程序

2、发送消息

Msg.proto内容如下:

package com.protocol;message Msg{required bytes head = 1;optional bytes body = 2;}message Head{required string head01 = 1;required int32 head02 = 2;required string head03 = 3;}message Body{required string body01 = 1;required int32 body02 = 2;required string body03 = 3;}
说明:每一个消息Msg包含消息头head和消息体body,消息头的定义在Head中,消息体的定义在Body中。

//发送消息如下:Msg.Builder msgBuilder = Msg.newBuilder();//构建消息头Head.Builder msgHeadBuilder = Head.newBuilder();msgHeadBuilder.setHead01("head01");msgHeadBuilder.setHead02(2);msgHeadBuilder.setHead03("head03");Head head=msgHeadBuilder.build();msgBuilder.setHead(head.toByteString());//构建消息体Body.Builder msgBodyBuilder = Body.newBuilder();msgBodyBuilder.setBody01("body01");msgBodyBuilder.setBody02(2);msgBodyBuilder.setBody03("body03");Body body=msgBodyBuilder.build();msgBuilder.setBody(body.toByteString());Msg msg = msgBuilder.build(); //构建整个消息对象//添加消息至队列并启动发送线程msgQueue.add(msg)if (!sendThreadIsAlive) {new SendThreadRunnable().start();}//一般情况下会另开线程来发送消息private InputStream inputstream = socket.getInputStream();;private OutputStream outputStream = socket.getOutputStream();;private boolean sendThreadIsAlive = false;   .//线程存活标志位private ConcurrentLinkedQueue<Msg> msgQueue = new ConcurrentLinkedQueue<Msg>();// 消息发送队列private class SendThread extends Thread {@Overridepublic void run() {sendThreadIsAlive = true;  //线程开启中将其置为truewhile (!msgQueue.isEmpty()) {try {if (socket != null && !socket.isClosed() && !socket.isInputShutdown() && !socket.isOutputShutdown()) {Msg msg = msgQueue.poll();if (msg != null) {try {outputStream.write(msg.toByteArray());outputStream.flush();} catch (IOException e) {}} else {}} else {msgQueue.clear();}} catch (Exception e) {}} sendThreadIsAlive = false;  //队列中没有消息后将其置为false,标识发送线程结束}}

3、接收解析

//同样另开线程来接收Msg,核心代码如下:byte tmpMsg[] = new byte[2048];int count = inputstream.read(tmpMsg);if (count < 0) {break;}byte[] message = new byte[count];System.arraycopy(tmpMsg, 0, message, 0, count);// 解析整个消息Msg msg = Msg.parseFrom(message);// 解析消息头ByteString head=msg.getHead();Head msgHead = Head.parseFrom(head);// head01String head01 = msgHead.getHead01();// head02int head02 = msgHead.getHead02();//解析消息体ByteString body = msg.getBody();Body msgBody = Body.parseFrom(body);//获得body的内容// body01String body01 = msgHead.getBody01();// body02int body02 = msgHead.getBody02();


原创粉丝点击