`

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();
			}
		}
	}
}

  • 大小: 11.2 KB
  • 大小: 17.5 KB
4
0
分享到:
评论

相关推荐

    android客户端服务端采用Socket通信

    在Android客户端中,我们通常使用`java.net.Socket`类来创建Socket实例,以连接到服务端。首先,我们需要指定服务器的IP地址和端口号,然后调用`connect()`方法建立连接。以下是一个简单的示例: ```java Socket ...

    安卓app之间的socket通信,支持多线程

    在安卓应用开发中,有时需要实现不同应用间的通信,Socket通信是一种常见的选择,尤其是在需要实时、低延迟的数据传输时。本教程将详细讲解如何在安卓应用程序之间通过Socket进行通信,并支持多线程处理,以提高效率...

    安卓Android基于Socket简易聊天项目开发.zip

    在本项目中,我们将探讨如何使用Android平台,结合Java编程语言和Apache的网络库,来开发一个基于Socket的简易聊天应用程序。这个项目旨在帮助开发者理解网络通信的基本原理,特别是Android应用中的实时通信机制。 ...

    Android高级应用源码-Android例子源码Socket实现粗略的聊天室功能.zip

    在Android平台上,开发一款具有聊天室功能的应用是一个...这份源码实例为开发者提供了一个学习和实践Android Socket通信的良好平台,通过深入理解这些知识点,你可以构建更复杂的网络应用,如实时聊天、文件传输等。

    Android socket编程2

    在Android开发中,Socket编程是实现设备间网络通信的关键技术之一。本文将深入探讨"Android socket编程2"这一主题,通过实例程序展示Android客户端如何与服务器端进行数据交互。 首先,Socket是网络通信中的一个...

    java语言与android的通信

    在Java和Android环境中,Socket通信允许开发者创建基于TCP/IP协议的可靠连接,确保数据的有序、无损传输。 Java客户端部分: 1. **创建Socket实例**:在Java客户端,我们需要首先创建一个Socket实例,指定Android...

    Android聊天工具基于socket实现

    在Android开发中,构建一个基于Socket的聊天工具可以让用户实现实时通信,这对于学习网络编程和Android应用开发是非常有价值的实践项目。以下将详细介绍如何利用Socket实现一个简单的Android聊天工具。 首先,...

    Android应用源码之仿微信聊天软件,Socket实现.zip

    在本压缩包中,我们拥有一个...这个项目涵盖了Android应用开发的多个重要方面,是学习Android Socket通信和即时通讯系统设计的绝佳实例。通过分析和理解源码,开发者可以提升自己在Android网络编程和UI设计方面的技能。

    android 游戏源码示例斗地主

    1. 如果源码支持多人在线对战,那么会涉及到网络编程,如Socket通信、WebSocket等技术,用于玩家之间的实时同步。 2. 数据序列化与反序列化:在网络通信中,游戏状态需要转化为可传输的格式,如JSON或protobuf。 六...

    android 飞鸽 聊天源码

    Android平台上的“飞鸽”聊天应用源码为我们提供了一个深入理解这两种协议如何在实际项目中应用的绝佳实例。本文将针对标题和描述中的关键知识点进行深入探讨。 首先,TCP是一种面向连接的、可靠的传输协议。它确保...

    android即时通讯APP程序.rar_android_即时通讯_局域网_局域网通讯APP

    在Android平台上开发即时通讯(Instant Messaging,IM)应用是一项复杂且技术含量高的任务,涉及到网络通信、数据传输、用户界面等多个方面。这个"android即时通讯APP程序.rar"压缩包提供了实现局域网内两个客户端...

    Android中国象棋源码(实用1).zip

    此外,源码中可能还包括了网络通信模块,如果该版本支持联网对战,那么它可能使用了Socket编程或基于HTTP的RESTful API来实现玩家间的实时通信。数据传输通常需要序列化和反序列化技术,如JSON或protobuf。 在软件...

    android 疯狂足球源代码

    9. **网络通信**:如果游戏包含在线多人对战功能,可能涉及到网络编程,如使用Socket或WebSocket进行数据交换,以及JSON或protobuf等序列化技术。 10. **游戏保存与加载**:游戏进度的保存和加载机制,可能是通过...

    HeliChat:android中的实例消息

    Android的Socket类可以用于TCP通信,而OkHttp或Volley这样的库则提供了更高级别的HTTP/HTTPS支持。 5. **数据序列化与解序列化**:为了在网络上传输对象,可能使用了JSON或protobuf等技术将数据转换为可传输的格式...

    Unity3D-NativeWebSocket

    2. **事件驱动编程**:WebSocket通信是基于事件的,你需要监听`OnOpen`、`OnMessage`、`OnError`和`OnClose`等事件来处理各种状态变化。例如,当WebSocket连接成功时,`OnOpen`事件会被触发;接收到服务器消息时,`...

    Android应用源码之中国象棋人机对战项目.zip

    本次我们将深入探讨一款基于Android的中国象棋人机对战项目的源码,旨在帮助读者理解和掌握Android应用开发中的关键技术和设计思路。 一、项目概述 该项目是一个典型的Android游戏开发实例,实现了用户与AI(人工...

    Android聊天功能

    在这个项目中,开发者自编了聊天应用,网络部分借鉴了《android疯狂讲义》这本书的内容,实现了手机间的实时通信。接下来,我们将深入探讨实现这一功能所涉及的核心技术和知识点。 1. **Android UI设计**: - 使用...

    grpc_flutter_app flutter 使用gRPC的demo

    gRPC是一个高性能、开源的通用RPC框架,它基于HTTP/2协议和Protocol Buffers(protobuf)进行通信。Flutter是Google推出的用于构建多平台应用程序的框架,支持Android和iOS,甚至扩展到Web和桌面平台。将gRPC与...

Global site tag (gtag.js) - Google Analytics