Protocol Buffer使用实例

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 {
		@Override
		public void run() {
			sendThreadIsAlive = true;  //线程开启中将其置为true
			while (!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);
	// head01
	String head01 = msgHead.getHead01();
	// head02
	int head02 = msgHead.getHead02();
	
	//解析消息体
	ByteString body = msg.getBody();
	Body msgBody = Body.parseFrom(body);
	
	//获得body的内容
	// body01
	String body01 = msgHead.getBody01();
	// body02
	int body02 = msgHead.getBody02();


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值