下面直接贴我的实例,工程在后面提供下载:
一、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(); } } } }