文档章节

Android 进程通信套接字LocalSocket

IamOkay
 IamOkay
发布于 2016/02/25 22:06
字数 642
阅读 434
收藏 3
点赞 1
评论 4

我们知道,Android上常见的多进程通讯有以下几种:

AIDL 进程通信接口

Binder接口

Messenger通信框架

BroadCastReciever 广播

ContentObserver/ContentProvider

FileObserver(http://blog.csdn.net/happy_6678/article/details/7095012)

网络,(http网络中转,rpc,dwr,jms,xmpp)

Intent通信

 

当然,我们还有另一种方案

LocalSocket 是Unix进程通信的基础

 

认识几个常用的函数:

客户端:

     LocalSocket客户端使用,创建套接字

     LocalSocketAddress 套接字地址,其实就是文件描述符(主要是服务器的地址,当然也可以客户端自个绑定地址)

setSoTimeout设置超时

connect客户端主动向服务端请求连接

服务端:

LocalServerSocket服务端使用,创建套接字同时指定文件描述符

accept等待客户端连接(阻塞)

共同:

getInputStream获取套接字输入流

getOutputStream获取套接字输出流

close关闭套接字,客户服务都需要

关于套接字的通信直接就是对java输入输出流的操作了,但是有一点很重要:对于套接字获取的各种输入或者输出流,如果调用close函数关闭了对应的流,那么套接字也会自动关闭了,再次对其获取输入输出流的时候会提示 socket not creat 。这点不同于C下socket的 shutdown函数,我也因为这折腾了很久。

下面不多说上代码,我对在客户端对其做了小小的封装:

class ClientConnect {  
    private static final String TAG = "ClientConnect";  
    private static final String name = "com.repackaging.localsocket";  
    private LocalSocket Client = null;  
    private PrintWriter os = null;  
    private BufferedReader is = null;  
    private int timeout = 30000;  
      
    public void connect(){    
        try {  
            Client = new LocalSocket();  
            Client.connect(new LocalSocketAddress(name));  
            Client.setSoTimeout(timeout);  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
              
    public void send(String[] data) {  
        try {  
            os = new PrintWriter(Client.getOutputStream());  
            for(int i = 0 ; i < data.length ; i ++){  
                os.println(data[0]);  
            }  
            os.println(FLAG);  
            os.flush();  
            Log.d(TAG,"send");  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
      
    public String recv() {  
        Log.d(TAG,"recv");  
        String result = null;  
        try {  
            is = new BufferedReader(new InputStreamReader(Client.getInputStream()));  
            result = is.readLine();  
            Log.d(TAG, result);  
        } catch (IOException e) {  
            e.printStackTrace();  
        } finally {  
        }  
        return result;  
    }  
      
    public void close() {  
        try {  
            is.close();  
            os.close();  
            Client.close();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
}

由于是在Android代码上使用,为了防止ANR,对于服务端,肯定是放到线程中去的。对于阻塞模式的客户端(recv等函数),也必须放在线程中。

服务端线程:

class ServerThread implements Runnable {  
  
    @Override  
    public void run() {  
        LocalServerSocket server = null;  
        BufferedReader mBufferedReader = null;  
        PrintWriter os = null;  
        LocalSocket connect = null;  
        String readString =null;  
        try {  
            server = new LocalServerSocket("com.repackaging.localsocket");        
            while (true) {  
                connect = server.accept();  
                Credentials cre = connect.getPeerCredentials();  
                Log.i(TAG,"accept socket uid:"+cre.getUid());  
                mBufferedReader = new BufferedReader(new InputStreamReader  
                        (connect.getInputStream()));  
                while((readString=mBufferedReader.readLine())!=null){  
                    if(readString.equals("finish")) break;  
                    Log.d(TAG,readString);  
                }  
                os = new PrintWriter(connect.getOutputStream());  
                os.println("allow");  
                os.flush();  
                Log.d(TAG,"send allow");  
            }     
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        finally{  
            try {  
                mBufferedReader.close();  
                os.close();  
                connect.close();  
                server.close();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
    }  
      
}

 

© 著作权归作者所有

共有 人打赏支持
IamOkay
粉丝 187
博文 458
码字总数 369998
作品 0
海淀
程序员
加载中

评论(4)

IamOkay
IamOkay

引用来自“554330833a”的评论

引用来自“IamOkay”的评论

引用来自“554330833a”的评论

LocalSocket 和 Socket有什么区别?

LocalSocket 是Unix进程通信套接字,主要用于进程通信,不是网络通信

哦,原来如此,请问为什么Android上开启ServerSocket后,从Socket中取得的IP地址是0.0.0.0的呢?有4G网络
没注意过,改天试试
554330833a
554330833a

引用来自“IamOkay”的评论

引用来自“554330833a”的评论

LocalSocket 和 Socket有什么区别?

LocalSocket 是Unix进程通信套接字,主要用于进程通信,不是网络通信

哦,原来如此,请问为什么Android上开启ServerSocket后,从Socket中取得的IP地址是0.0.0.0的呢?有4G网络
IamOkay
IamOkay

引用来自“554330833a”的评论

LocalSocket 和 Socket有什么区别?

LocalSocket 是Unix进程通信套接字,主要用于进程通信,不是网络通信
554330833a
554330833a
LocalSocket 和 Socket有什么区别?
Android安全模型之Android安全机制(进程通信)

进程通信是应用程序进程之间通过操作系统交换数据与服务对象的机制。Linux操作系统的传统进程间通信(IPC)有多种方式,比如管道,命令管道,信号量,共享内存,消息队列,以及网络与Unix套接...

柳哥
2014/12/02
0
0
Android进程框架:进程的创建、启动与调度流程

关于作者 郭孝星,程序员,吉他手,主要从事Android平台基础架构方面的工作,欢迎交流技术方面的问题,可以去我的Github提issue或者发邮件至guoxiaoxingse@163.com与我交流。 文章目录 一 进...

郭孝星
01/21
0
0
浅入浅出 Android 安全:第二章 Android Linux 内核层安全

第二章 Android Linux 内核层安全 来源:Yury Zhauniarovich | Publications 译者:飞龙 协议:CC BY-NC-SA 4.0 作为最广为人知的开源项目之一,Linux 已经被证明是一个安全,可信和稳定的软...

apachecn_飞龙
2016/11/30
0
0
进程系列第二篇---Zygote进程的创建流程

概述: 本文(基于Android O源码)主要讲解Zygote进程创建流程,线程容易创建,但进程的相关的东西都被系统很好的封装了,以至于进程的创建,很多人还是头一回。首先一张图来看看Zygote进程在...

LooperJing
07/09
0
0
Android4.4的zygote进程

Android4.4的zygote进程 侯亮 1背景 前些天为了在科室做培训,我基于Android 4.4重新整理了一份关于zygote的文档。从技术的角度看,这几年zygote并没有出现什么大的变化,所以如果有人以前研...

悠然红茶
2015/06/22
0
9
在 Android P 中使用默认 TLS 来保护您的用户

作者:Chad Brubaker - Android 安全部门高级软件工程师 Android 一直致力于保护其用户、用户的设备以及用户数据的安全。其中一种保持数据安全的方式是让所有进入或离开 Android 设备的数据通...

Android_开发者
06/27
0
0
Android 进阶之网络协议及网络知识

OSI 七层网络模型 为了使不同厂家生产的计算机可以相互通信,建立更大范围的计算机网络,国际标准化组织(ISO)在 1984 年提出了“开放系统互联参考模型”,即 OSI/RM 模型(Open System Int...

猴亮屏
05/02
0
0
[译] 在 Android P 中使用默认的 TLS 来保护你的用户

原文地址:Protecting users with TLS by default in Android P 原文作者:Chad Brubaker 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m… 译者:hanliuxin5 校对者:andro...

Android_开发者
06/20
0
0
Android蓝牙开发技术指南

Android蓝牙开发技术指南 Android 蓝牙开发技术 要学习蓝牙先认识 一 RFCOMM 通道: RFCOMM 协议 一个基于欧洲电信标准协会 ETSI07.10 规程的串行线性仿真协议。此协议提供 RS232 控制和状态...

庸人谷
2012/12/06
0
0
android连网详解——android.net、org.apache.http联网实现

1.连网相关包介绍 今天我们将深入介绍了Android SDK 中一些与网络有关的package,如下: 包描述 java.net 提供与联网有关的类,包括流和数据包(datagram)sockets、Internet 协议和常见 HT...

JavaGG
2011/05/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Hive应用:外部分区表

Hive应用:外部分区表 介绍 Hive可以创建外部分区表。创建表的时候,分区要在建表语句中体现。建完之后,你不会在表中看到数据,需要进行分区添加,使用alter语句进行添加。然后数据才会显示...

星汉
9分钟前
0
0
点击Enter登录

1. 效果 2. 实现过程(记得引入jq文件) //6.回车事件 登录 $(function() { document.onkeydown = function(event) { var e = event || window.event || arguments.callee.caller.arguments......

Lucky_Me
15分钟前
0
0
点击菜单内容切换

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .menu{ height: 38px; background-color: #eeeeee; line-height: 38px; } .mao{ ......

南桥北木
57分钟前
1
0
OSChina 周六乱弹 —— 妹子和游戏哪个更好玩

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @andonny :分享唐朝乐队的单曲《国际歌》 《国际歌》- 唐朝乐队 手机党少年们想听歌,请使劲儿戳(这里) @举个栗子- :日常祈雨 邪恶的大祭...

小小编辑
今天
404
6
流利阅读笔记32-20180721待学习

“人工智能”造假:只有人工,没有智能 Lala 2018-07-21 1.今日导读 当今社会,擅长单个方面的人工智能已经盛行,手机借助 AI 智慧防抖技术帮助大家拍出清晰照片,谷歌研发的 AI 助手将可以帮...

aibinxiao
今天
6
0
我的成长记录(一)

今天突然精神抖擞,在我的博客下新开一项分类>成长记录,专门记录每隔一段时间我的一点感悟吧。因为今天才专门花时间新开这样一个分类,所以以前有过的一些感悟没有记录下来,现在已经想不起...

dtqq
今天
0
0
机器学习管理平台 MLFlow

最近工作很忙,博客一直都没有更新。抽时间给大家介绍一下Databrick开源的机器学习管理平台-MLFlow。 谈起Databrick,相信即使是不熟悉机器学习和大数据的工程湿们也都有所了解,它由Spark的...

naughty
今天
1
0
idea tomcat 远程调试

tomcat 配置 编辑文件${tomcat_home}/bin/catalina.sh,在文件开头添加如下代码。    CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7829" Idea端配......

qwfys
今天
1
0
遍历目录下的文件每250M打包一个文件

#!/usr/bin/env python # -*- utf-8 -*- # @Time : 2018/7/20 0020 下午 10:16 # @Author : 陈元 # @Email : abcmeabc@163.com # @file : tarFile.py import os import tarfile import thr......

寻爱的小草
今天
1
0
expect同步文件&expect指定host和要同步的文件&构建文件分发系统&批量远程执行命令

20.31 expect脚本同步文件 expect通过与rsync结合,可以在一台机器上把文件自动同步到多台机器上 编写脚本 [root@linux-5 ~]# cd /usr/local/sbin[root@linux-5 sbin]# vim 4.expect#!/...

影夜Linux
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部