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


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

Java代码 复制代码  收藏代码
  1. package pbmsg;  
  2.   
  3. option java_outer_classname="UserProto";//生成.Java文件的名字  
  4.   
  5. message User{  
  6.     //要传输的数据定义,通常与实体类对应  
  7.     required int32 id=1;   
  8.     required int64 id=2//与long对应;  
  9.     required string userName=3;  
  10.     required string password=4;  
  11.     optional string age=5//required必填,optional选填  
  12. }  
  13.   
  14. message PbGetAlluser  
  15. {   
  16.     repeated User userList  = 10;//用户列表  
  17.         int32 listSize = 11;  
  18. };  
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;
};


编译命令:
Java代码 复制代码  收藏代码
  1. protoc.exe --java_out=./ User.proto  
protoc.exe --java_out=./ User.proto


二、服务端:




关键代码Main.Java
Java代码 复制代码  收藏代码
  1. package com.jerome.test;  
  2.   
  3. public class Main {  
  4.   
  5.     public static void main(String[] args) {  
  6.         new Thread(new DealThread()).start();  
  7.     }  
  8. }  
package com.jerome.test;

public class Main {

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


DealThread.Java
Java代码 复制代码  收藏代码
  1. package com.jerome.test;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.net.ServerSocket;  
  6. import java.net.Socket;  
  7.   
  8. import pbmsg.UserProto.User;  
  9.   
  10. public class DealThread implements Runnable {  
  11.   
  12.     ServerSocket sSocket = null;  
  13.   
  14.     @Override  
  15.     public void run() {  
  16.         try {  
  17.             sSocket = new ServerSocket(12345);  
  18.             while (true) {  
  19.                 Socket socket = sSocket.accept();  
  20.                 InputStream inputstream = socket.getInputStream();  
  21.   
  22.                 byte len[] = new byte[1024];  
  23.                 int count = inputstream.read(len);  
  24.                 byte[] temp = new byte[count];  
  25.                 for (int i = 0; i < count; i++) {  
  26.                     temp[i] = len[i];  
  27.                 }  
  28.   
  29.                 User user = User.parseFrom(temp);  
  30.                 System.out.println(user.getID());  
  31.                 System.out.println(user.getUserName());  
  32.                 System.out.println(user.getPassword());  
  33.                   
  34.   
  35.                 User uproto = User.newBuilder().setID(88888888)  
  36.                         .setPassword("654321").setUserName("zwq").build();  
  37.                 uproto.writeTo(socket.getOutputStream());  
  38.             }  
  39.         } catch (IOException e) {  
  40.             e.printStackTrace();  
  41.         }  
  42.   
  43.     }  
  44.   
  45. }  
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();
		}

	}

}


三、客户端



Java代码 复制代码  收藏代码
  1. package com.jerome.test;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.net.Socket;  
  6. import java.net.UnknownHostException;  
  7.   
  8. import pbmsg.UserProto.User;  
  9. import android.app.Activity;  
  10. import android.os.Bundle;  
  11. import android.util.Log;  
  12. import android.view.View;  
  13. import android.view.View.OnClickListener;  
  14. import android.widget.Button;  
  15. import android.widget.TextView;  
  16.   
  17. public class MainActivity extends Activity {  
  18.   
  19.     Button button = null;  
  20.     TextView text = null;  
  21.     Socket socket = null;  
  22.   
  23.     @Override  
  24.     protected void onCreate(Bundle savedInstanceState) {  
  25.         super.onCreate(savedInstanceState);  
  26.         setContentView(R.layout.activity_main);  
  27.   
  28.         button = (Button) findViewById(R.id.button);  
  29.         text = (TextView) findViewById(R.id.text);  
  30.         button.setOnClickListener(new OnClickListener() {  
  31.   
  32.             @Override  
  33.             public void onClick(View v) {  
  34.                 //网络请求必须要在线程中完成;  
  35.                   
  36.                 //发送线程  
  37.                 new Thread() {  
  38.                     public void run() {  
  39.                         sendText();  
  40.                     }  
  41.                 }.start();  
  42.   
  43.                 //接受线程  
  44.                 new Thread() {  
  45.                     public void run() {  
  46.                         getText();  
  47.                     }  
  48.                 }.start();  
  49.             }  
  50.   
  51.         });  
  52.     }  
  53.   
  54.     private void sendText() {  
  55.         try {  
  56.             socket = new Socket("192.168.7.119"12345);  
  57.             User uproto = User.newBuilder().setID(147258369)  
  58.                     .setPassword("123456").setUserName("jerome").build();  
  59.             uproto.writeTo(socket.getOutputStream());  
  60.   
  61.             //也可以在这儿接受流,也可以启动新线程用于接受  
  62. //          InputStream inputstream = socket.getInputStream();  
  63. //          byte len[] = new byte[1024];  
  64. //          int count = inputstream.read(len);  
  65. //          byte[] temp = new byte[count];  
  66. //          for (int i = 0; i < count; i++) {  
  67. //              temp[i] = len[i];  
  68. //          }  
  69.   
  70. //          User user = User.parseFrom(temp);  
  71. //          Log.i("zwq", "Id:" + user.getID() + "____" + user.getUserName() + "____" + user.getPassword());  
  72.         } catch (UnknownHostException e) {  
  73.             e.printStackTrace();  
  74.         } catch (IOException e) {  
  75.             e.printStackTrace();  
  76.         } finally {  
  77.         }  
  78.     }  
  79.   
  80.     private void getText() {  
  81.         while (true) {  
  82.             try {  
  83.                 if (null != socket) {  
  84.                     InputStream inputStream = socket.getInputStream();  
  85.                     if (null != inputStream) {  
  86.                         byte len[] = new byte[1024];  
  87.                         int count = inputStream.read(len);  
  88.                         byte[] temp = new byte[count];  
  89.                         for (int i = 0; i < count; i++) {  
  90.                             temp[i] = len[i];  
  91.                         }  
  92.   
  93.                         User user = User.parseFrom(temp);  
  94.                         Log.i("zwq","Id:" + user.getID() + "____"+ user.getUserName() + "____"+ user.getPassword());  
  95.                     }  
  96.                 }  
  97.             } catch (Exception e) {  
  98.                 e.printStackTrace();  
  99.             }  
  100.         }  
  101.     }  
  102. }  
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();
			}
		}
	}
}

  • 大小: 11.2 KB
  • 大小: 17.5 KB
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值