Android中基于protobuf的socket通信的实例

关于Protobuf的获取、用法见这篇文章:http://www.cnblogs.com/reborter/archive/2012/06/04/2535213.html
下面直接贴我的实例,工程在后面提供下载:
一、proto协议:

package pbmsg;

option java_outer_classname="UserProto";//生成.Java文件的名字

message User{
	//要传输的数据定义,通常与实体类对应
    required int32 id=1; 
    required int64 id=2; //与long对应;
    required string userName=3;
    required string password=4;
    optional string age=5; //required必填,optional选填
}

message PbGetAlluser
{ 
	repeated User userList 	= 10;//用户列表
        int32 listSize = 11;
};


编译命令:
protoc.exe --java_out=./ User.proto


二、服务端:




关键代码Main.Java
package com.jerome.test;

public class Main {

	public static void main(String[] args) {
		new Thread(new DealThread()).start();
	}
}


DealThread.Java
package com.jerome.test;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

import pbmsg.UserProto.User;

public class DealThread implements Runnable {

	ServerSocket sSocket = null;

	@Override
	public void run() {
		try {
			sSocket = new ServerSocket(12345);
			while (true) {
				Socket socket = sSocket.accept();
				InputStream inputstream = socket.getInputStream();

				byte len[] = new byte[1024];
				int count = inputstream.read(len);
				byte[] temp = new byte[count];
				for (int i = 0; i < count; i++) {
					temp[i] = len[i];
				}

				User user = User.parseFrom(temp);
				System.out.println(user.getID());
				System.out.println(user.getUserName());
				System.out.println(user.getPassword());
				

				User uproto = User.newBuilder().setID(88888888)
						.setPassword("654321").setUserName("zwq").build();
				uproto.writeTo(socket.getOutputStream());
			}
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}


三、客户端



package com.jerome.test;

import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.net.UnknownHostException;

import pbmsg.UserProto.User;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

	Button button = null;
	TextView text = null;
	Socket socket = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		button = (Button) findViewById(R.id.button);
		text = (TextView) findViewById(R.id.text);
		button.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				//网络请求必须要在线程中完成;
				
				//发送线程
				new Thread() {
					public void run() {
						sendText();
					}
				}.start();

				//接受线程
				new Thread() {
					public void run() {
						getText();
					}
				}.start();
			}

		});
	}

	private void sendText() {
		try {
			socket = new Socket("192.168.7.119", 12345);
			User uproto = User.newBuilder().setID(147258369)
					.setPassword("123456").setUserName("jerome").build();
			uproto.writeTo(socket.getOutputStream());

			//也可以在这儿接受流,也可以启动新线程用于接受
//			InputStream inputstream = socket.getInputStream();
//			byte len[] = new byte[1024];
//			int count = inputstream.read(len);
//			byte[] temp = new byte[count];
//			for (int i = 0; i < count; i++) {
//				temp[i] = len[i];
//			}

//			User user = User.parseFrom(temp);
//			Log.i("zwq", "Id:" + user.getID() + "____" + user.getUserName() + "____" + user.getPassword());
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
		}
	}

	private void getText() {
		while (true) {
			try {
				if (null != socket) {
					InputStream inputStream = socket.getInputStream();
					if (null != inputStream) {
						byte len[] = new byte[1024];
						int count = inputStream.read(len);
						byte[] temp = new byte[count];
						for (int i = 0; i < count; i++) {
							temp[i] = len[i];
						}

						User user = User.parseFrom(temp);
						Log.i("zwq","Id:" + user.getID() + "____"+ user.getUserName() + "____"+ user.getPassword());
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

猜你喜欢

转载自gqdy365.iteye.com/blog/2163076