LocalSocket,在Unix域名空间创建的一个套接字(非服务端)。

是对Linux中Socket进行了封装,采用JNI方式调用,实现进程间通信。

具体就是Native层Server和Framework层Client之间进行通信,或在各层次中能使用Client/Server模式实现通信。

在这里通过LocalSocket实现应用之间的通信,可以接收、发送数据,同时将接收到的数据通过activty显示。

Server端:

package com.example.driverexam;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter; import android.net.Credentials;
import android.net.LocalServerSocket;
import android.net.LocalSocket;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
/**
* 通过LocalSocket实现
* @author Administrator
*
*/
public class ServerFinally implements Runnable{
private static final String TAG="ServerFinally";
LocalServerSocket server;
LocalSocket client;
PrintWriter os;
BufferedReader is; Handler handler; /**
* 此处不将连接代码写在构造方法中的原因:
* 我在activity的onCreate()中创建示例,如果将连接代码 写在构造方法中,服务端会一直等待客户端连接,界面没有去描绘,会一直出现白屏。
* 直到客户端连接上了,界面才会描绘出来。原因是构造方法阻塞了主线程,要另开一个线程。在这里我将它写在了run()中。
*/
ServerFinally(Handler handler){
this.handler=handler; // try {
// Log.i(TAG, "Server=======打开服务=========");
// server=new LocalServerSocket("com.repackaging.localsocket");
// client=server.accept();
// Log.i(TAG, "Server=======客户端连接成功=========");
// Credentials cre=client.getPeerCredentials();
// Log.i(TAG, "===客户端ID为:"+cre.getUid());
// os=new PrintWriter(client.getOutputStream());
// is=new BufferedReader(new InputStreamReader(client.getInputStream()));
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
} //发数据
public void send(String data){
if (os!=null) {
os.println(data);
os.flush();
}
} //接数据
@Override
public void run() {
Log.i(TAG, "Server=======打开服务=========");
try {
server=new LocalServerSocket("com.repackaging.localsocket"); client=server.accept();
Log.i(TAG, "Server=======客户端连接成功=========");
Credentials cre=client.getPeerCredentials();
Log.i(TAG, "===客户端ID为:"+cre.getUid());
os=new PrintWriter(client.getOutputStream());
is=new BufferedReader(new InputStreamReader(client.getInputStream()));
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} String result="";
while(true){
try {
result=is.readLine();
Log.i(TAG, "服务端接到的数据为:"+result);
//把数据带回activity显示
Message msg=handler.obtainMessage();
msg.obj=result;
msg.arg1=0x11;
handler.sendMessage(msg);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} } public void close(){
try {
if (os!=null) {
os.close();
}
if (is!=null) {
is.close();
}
if(client!=null){
client.close();
}
if (server!=null) {
server.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
}

ServerFinallyActivity.java

package com.example.driverexam;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView; public class ServerFinallyActivity extends Activity { EditText et_serverSend;
TextView tv_showReceiveData; ServerFinally server; // ServerLastly server;
StringBuffer receiveData=new StringBuffer(); Handler handler=new Handler(new Handler.Callback() { @Override
public boolean handleMessage(Message msg) {
if (msg.arg1==0x11) {
receiveData.append((String)msg.obj);
tv_showReceiveData.setText(receiveData);
receiveData.append("\r\n");
} return false;
}
}); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_server_finally);
et_serverSend=(EditText) findViewById(R.id.et_serverSend);
tv_showReceiveData=(TextView) findViewById(R.id.tv_showReceiveData); server=new ServerFinally(handler);
new Thread(server).start(); // server=new ServerLastly(handler);
// new Thread(server).start(); } //发数据
public void btn_serverSend(View view){
server.send(et_serverSend.getText().toString()+"");
et_serverSend.setText("");
} @Override
protected void onDestroy() {
super.onDestroy();
server.close();
} }

Client端:

ClientFinally.java

package com.fqhx.remoteserviceclient;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter; import android.net.LocalSocket;
import android.net.LocalSocketAddress;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
/**
* 通过LocalSocket实现
* @author Administrator
*
*/
public class ClientFinally implements Runnable{
private static final String TAG="ClientFinally";
private static final String NAME="com.repackaging.localsocket";
private int timeout=30000;
LocalSocket client;
PrintWriter os;
BufferedReader is; Handler handler; ClientFinally(Handler handler){
this.handler=handler;
// client=new LocalSocket();
// try {
// client.connect(new LocalSocketAddress(NAME));//连接服务器
// Log.i(TAG, "Client=======连接服务器成功=========");
// client.setSoTimeout(timeout);
// os=new PrintWriter(client.getOutputStream());
// is=new BufferedReader(new InputStreamReader(client.getInputStream()));
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
} //发数据
public void send(String data){
if (os!=null) {
os.println(data);
os.flush();
}
} @Override
public void run() {
client=new LocalSocket();
try {
client.connect(new LocalSocketAddress(NAME));//连接服务器
Log.i(TAG, "Client=======连接服务器成功=========");
client.setSoTimeout(timeout);
os=new PrintWriter(client.getOutputStream());
is=new BufferedReader(new InputStreamReader(client.getInputStream()));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} String result="";
while(true){
try {
result=is.readLine();
Log.i(TAG, "客户端接到的数据为:"+result);
//将数据带回acitvity显示
Message msg=handler.obtainMessage();
msg.arg1=0x12;
msg.obj=result;
handler.sendMessage(msg);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} } public void close(){
try {
if (os!=null) {
os.close();
}
if (is!=null) {
is.close();
}
if(client!=null){
client.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
}

ClientFinallyActivity.java

package com.fqhx.remoteserviceclient;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView; public class ClientFinallyActivity extends Activity { ClientFinally client;
EditText et_clientSend;
TextView tv_showReceiveDataClient; // ClientLastly client;
StringBuffer receiveData=new StringBuffer(); Handler handler=new Handler(new Handler.Callback() { @Override
public boolean handleMessage(Message msg) {
if (msg.arg1==0x12) {
receiveData.append((String)msg.obj);
tv_showReceiveDataClient.setText(receiveData);
receiveData.append("\r\n");
} return false;
}
}); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_client_finally); et_clientSend=(EditText) findViewById(R.id.et_clientSend);
tv_showReceiveDataClient=(TextView) findViewById(R.id.tv_showReceiveDataClient); client=new ClientFinally(handler);
new Thread(client).start(); // client=new ClientLastly(handler);
// new Thread(client).start();
} public void btn_clientSend(View view){
client.send(et_clientSend.getText().toString()+"");
et_clientSend.setText("");
} @Override
protected void onDestroy() {
super.onDestroy();
client.close();
}
}

Android进程间通信之LocalSocket通信的更多相关文章

  1. Android进程间通信之socket通信

    用Java中的socket编程. 通过socket实现两个应用之间的通信,可以接收和发送数据,同时将接收到的数据显示在activity界面上. Server端: ServerLastly.java p ...

  2. Android : App通过LocalSocket 与 HAL间通信

    LocalSocket其通信方式与Socket差不多,只是LocalSocket没有跨越网络边界.对于*nix系统来说,“一切皆为文件”,Socket也不例外,Socket按照收发双方的媒介来说有三种 ...

  3. Android进程间的通信之AIDL

    Android服务被设计用来执行很多操作,比如说,可以执行运行时间长的耗时操作,比较耗时的网络操作,甚至是在一个单独进程中的永不会结束的操作.实现这些操作之一是通过Android接口定义语言(AIDL ...

  4. android 进程间通信---bind的前世

    在分析bind机制之前,我发现已经有一篇文章讲解的非常清晰,并且提出了很多问题. 地址:http://my.oschina.net/keeponmoving/blog/64218 一.Linux系统进 ...

  5. 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6621566 上一篇文章Android进程间通信 ...

  6. Android进程间通信

    http://www.cnblogs.com/manuosex/p/3588634.html 一.Linux系统进程间通信有哪些方式? 1.socket: 2.name pipe命名管道: 3.mes ...

  7. Android 进程间通信

    什么鬼!单例居然失效了,一个地方设置值,另个地方居然取不到,这怎么可能?没道理啊!排查半天,发现这两就不在一个进程里,才恍然大悟-- 什么是进程 按照操作系统中的描述:进程一般指一个执行单元,在 PC ...

  8. [转]Android进程间通信

    Android进程间通信 一.Linux系统进程间通信有哪些方式? 1.socket: 2.name pipe命名管道: 3.message queue消息队列: 4.singal信号量: 5.sha ...

  9. 图文详解 Android Binder跨进程通信机制 原理

    图文详解 Android Binder跨进程通信机制 原理 目录 目录 1. Binder到底是什么? 中文即 粘合剂,意思为粘合了两个不同的进程 网上有很多对Binder的定义,但都说不清楚:Bin ...

随机推荐

  1. xxxx年度员工岗位技能调查表

    昨天应公司要求设计了一张 <员工岗位技能调查表>,写微博有2个目的:第一是供大家参考,第二是记录下从事质量管理工作走过的点点滴滴.这是我第一次写工作方面的博客,之后会坚持写下去的. --- ...

  2. java 动态代理示例,带主要注释

    Java proxy是基于反射,仅仅支持基于接口的动态代理. java 动态代理是一切架构的基础,必须了解. 废话少说,先上代码获得感性认识. 示例代码有主要注释. 接口: public interf ...

  3. 开源库Magicodes.WeChat.SDK总体介绍

    目录 1    概要    1 2    主要特点    2 3    架构图    8 3.1    构造器——WeChatSDKBuilder    8 3.2    函数管理器——WeChatF ...

  4. 避开WebForm天坑,拥抱ASP.Net MVC吧

    有鹏友在如鹏网的QQ群中提了一个问题: 请问,在ASP.Net中如何隐藏一个MenuItem,我想根据不同的权限,对功能菜单进行隐藏,用style不行. 如果要仅仅解答这个问题,很好解答,答案很简单: ...

  5. VS2008 Pocket PC 2003 SE仿真程序上网设置

    设置大体分为3个步骤:Microsoft ActiveSync安装配置.Pocket PC 2003 SE仿真程序配置.Pocket PC 2003连接到Microsoft ActiveSync. 1 ...

  6. Intellij笔记

    环境 官网: http://www.jetbrains.com/idea/download/ 需要Java的JDK,需要安装 JDK,而不是 JRE! http://www.oracle.com/te ...

  7. 【WEB】Tomcat基础使用知识

    由于当前项目性质原因,从开始到现在使用的WEB服务器都是WAS,而Tomcat的基础知识也慢慢地被遗忘.由于种种原因,让我参与到了另外一个全新的项目,使用的是Tomcat6.X,所以复习是必须的,而写 ...

  8. 《你必须知道的.NET》读书笔记:方法表初窥

    一.窥探准备工作 public class Base { public void M() { Console.WriteLine("M in Base"); } public vi ...

  9. TDD(测试驱动开发)培训录

    2014年我一直从事在敏捷实践咨询项目,这也是我颇有收获的一年,特别是咨询项目的每一点改变,不管是代码质量的提高,还是自组织团队的建设,都能让我们感到欣慰.涉及人的问题都是复杂问题,改变人,改变一个组 ...

  10. 《Wireshark数据包分析实战》 - http背后,tcp/ip抓包分析

    作为网络开发人员,使用fiddler无疑是最好的选择,方便易用功能强. 但是什么作为爱学习的同学,是不应该止步于http协议的,学习wireshark则可以满足这方面的需求.wireshark作为抓取 ...