Google protobuf在android下面运用

本文介绍了一个基于Android的应用程序,该程序作为客户端能够连接到远程服务器请求实时股票行情数据。通过Socket编程实现通信,并使用Protocol Buffers进行数据序列化。
package com.demo;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

import quote.Quote;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

//客户端的实现
public class MainActivity extends Activity {
	private TextView text1;
	private Button but1;
	Socket socket = null;

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.main);

		text1 = (TextView) findViewById(R.id.text1);
		but1 = (Button) findViewById(R.id.button1);

		but1.setOnClickListener(new Button.OnClickListener() {
			@Override
			public void onClick(View v) {
				try {
					socket = new Socket("172.16.3.3", 8000);
					
					Quote.RealtimeRequest req = Quote.RealtimeRequest.newBuilder().setSeccode("sh600000").build();
					int req_pkgbody_length = req.getSerializedSize();
					Log.i(">>>>>>>>>req_pkgbody_length>>>>>>>>>", req_pkgbody_length+">>>>>>>>>>>>>>");
					Quote.PkgHeader req_pkgheader = Quote.PkgHeader.newBuilder().setBodySize(req_pkgbody_length)
							.setVer("1.0").setEnc(false).setZip(false).setMore(false).setMsgType(Quote.PkgHeader.MsgType.REQ_REALTIME)
							.build();
					int req_pkgheader_length = req_pkgheader.getSerializedSize();
					Log.i(">>>>>>>>>req_pkgheader_length>>>>>>>>>", req_pkgheader_length+">>>>>>>>>>>>>>");
					byte[] req_pkg = new byte[req_pkgheader_length + req_pkgbody_length];
					byte[] b1 = req.toByteArray();
					byte[] b2 = req_pkgheader.toByteArray();

					System.arraycopy(b1, 0, req_pkg, 0, b1.length);
					System.arraycopy(b2, 0, req_pkg, b1.length, b2.length);
					
					DataOutputStream out = new DataOutputStream(socket.getOutputStream());
					out.write(req_pkg);
					out.flush();
					
					Log.i(">>>>>>>>>out>>>>>>>>>", ">>>>>>>>>>>>>>");
					
					DataInputStream in = new DataInputStream(socket.getInputStream());
					byte[] res_pkgheader = new byte[15];
					in.readFully(res_pkgheader, 0, 15);
					
					Quote.PkgHeader res_pkgheader_ = Quote.PkgHeader.parseFrom(res_pkgheader);
					int res_pkgbody_length = res_pkgheader_.getBodySize();
					byte[] res_pkgbody = new byte[res_pkgbody_length];
					in.readFully(res_pkgbody, 0, res_pkgbody_length);
					
					Log.i(">>>>>>>>>res_pkgbody_length>>>>>>>>>", res_pkgbody.length+">>>>>>>>>>>>>>");

					Quote.RealTimeResponse res_realtime = Quote.RealTimeResponse.parseFrom(res_pkgbody);
					
					text1.setText(res_realtime.getNewprice() + ">>>>>>>");
					socket.close();
				} catch (UnknownHostException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});

	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值