Android中LocalSocket使用

摘要:
LocalServerSocket创建服务器端Unix域套接字,与LocalSocket对应。LocalSocketImplFramework层Socket的实现,通过JNI调用系统socketAPI。LocalSocketAddressUnix域socket的地址以及所处的空间。JNI访问接口:\frameworks\base\core\jni\android_net_LocalSocketImpl.cppsocket_createsocket_connect_localsocket_bind_localsocket_listen……下面看看这几个类之间的关系:使用Android的LocalSocket建立socket通信,是基于网络socket过程一致的。建立socket通信,也可以在代码执行过程中进行,使用LocalSocket与LocalServerSocket。四LocalSocket与LocalServerSocket建立socket通信LocalSocket就是作为客户端建立于服务端的连接,发送数据。LocalServerSocket作为服务端使用,建立socket监听客户端请求。

一 Socket

Socket最初用在基于TCP/IP网络间进程通信中,以客户端/服务器模式进行通信。

实现异步操作,共享资源集中处理,提高客户端响应能力。

Tcp通信基本流程:

服务器端 客户端

1.创建socket1.创建socket

2.bind()

3.listen()

4.accecp()

----等待客户端连接---- 2.connect()

5.读数据(recv)3.写数据(send)

6.写数据(send)4.读数据(recv)

7.关闭socket(closesocket()) 5.关闭socket(closesocket())

数据流:

Android中LocalSocket使用第1张

二 Android LocalSocket

LocalSocket

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

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

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

LocalServerSocket

创建服务器端Unix域套接字,与LocalSocket对应。

LocalSocketImpl

Framework层Socket的实现,通过JNI调用系统socket API。

LocalSocketAddress

Unix域socket的地址以及所处的空间。

JNI访问接口:\frameworks\base\core\jni\android_net_LocalSocketImpl.cpp

socket_create

socket_connect_local

socket_bind_local

socket_listen

……

下面看看这几个类之间的关系:

Android中LocalSocket使用第2张

使用Android的LocalSocket建立socket通信,是基于网络socket过程一致的。

三 native与framework之间的通信

以install这个服务为例:

1 增加socket资源

\system\core\rootdir\init.rc中:

service installd /system/bin/installd

class main

socket installd stream 600 system system

在启动install服务时,就会为install分配socket文件系统资源:dev/socket/installd

Install服务的Socket资源和名称installd绑定起来。

这些都是在开机初始化化init进程中启动service时完成:

service_start

create_socket

publish_socket

2 native层

install进程 建立服务端程序

native 层中作为server:\frameworks\base\cmds\installd\installd.c

int main(const int argc, const char *argv[]) 
{
    //获取已绑定socket
    lsocket =android_get_control_socket(SOCKET_PATH);

    //监听socket
    listen(lsocket, 5);

    for(;;) {
        //等待客户端建立连接
        s = accept(lsocket, &addr, &alen);
        for(;;) {
                 //接收数据 相当于recv
readx(s, buf, count);

                 //执行相关的操作
execute(s, buf);
        }

        //关闭socket
close(s);
    }
}                

3 framework层

客户端程序:

\frameworks\base\services\java\com\android\server\pm\Installer.java

boolean connect() 
{
       //创建socket
       mSocket = newLocalSocket();

       //设置连接地址
       LocalSocketAddress address = new             LocalSocketAddress("installd",
                    LocalSocketAddress.Namespace.RESERVED);

       //建立连接
mSocket.connect(address);

       //获取数据输入流 可以读数据
       mIn =mSocket.getInputStream();

       //获取数据输出流 可以写数据
       mOut =mSocket.getOutputStream();
}

因此以native层service与framework建立client/server模式socket通信主要代码:

java层主要代码:

      LocalSocket s =null;
    LocalSocketAddress l;

       s = newLocalSocket();
       l = newLocalSocketAddress(SOCKET_NAME,
      LocalSocketAddress.Namespace.RESERVED);
       s.connect(l);

native层主要代码:

     s_fdListen =android_get_control_socket(SOCKET_NAME);
       ret =listen(s_fdListen, n);
       s_fdCommand = accept(s_fdListen, (sockaddr *) &peeraddr, &socklen);

init.rc中加入:

service myserver /system/bin/myserver
       classmain
       socket myserver stream 600system system
       ……

当然建立这种client/server模式并不一定要在native层和framework层,仅在framework层也能够进行。

系统提供了LocalSocket作为客户端使用,同时提供了LocalServerSocket作为服务端使用。

Zygote服务使用了LocalServerSocket作为服务端socket通信。

建立socket通信,也可以在代码执行过程中进行,使用LocalSocket与LocalServerSocket。

在init.rc中为服务端建立的socket资源和初始化时绑定,与在代码中使用LocalServerSocket

建立的服务端socket资源在Linux域空间不同而已,过程是一样的跟一般的socket通信过程一致。

四 LocalSocket与LocalServerSocket建立socket通信

LocalSocket就是作为客户端建立于服务端的连接,发送数据。

LocalServerSocket作为服务端使用,建立socket监听客户端请求。通过构造函数看到有两种方式:

在Linux抽象空间 创建一个新的服务端socket:

publicLocalServerSocket(String name) throws IOException
{
        //创建socket资源
        impl = newLocalSocketImpl();
        impl.create(true);

        //绑定地址
        localAddress = newLocalSocketAddress(name);
        impl.bind(localAddress);

        //监听
impl.listen(LISTEN_BACKLOG);
}

用文件描述符创建已经存在并且绑定的服务端socket:

如在init.rc中指定socket资源 dev/socket/……,zygote使用此方式创建作为服务端的socket

LocalServerSocketsocket = new LocalServerSocket(createFileDescriptor(fileDesc));

publicLocalServerSocket(FileDescriptor fd) throws IOException
{
        //已绑定 监听
        impl = newLocalSocketImpl(fd);
        impl.listen(LISTEN_BACKLOG);
        localAddress =impl.getSockAddress();
}

通常使用过程中:

客户端代码:

String message;

//创建socket
LocalSocket sender = newLocalSocket();

//建立对应地址连接
sender.connect(newLocalSocketAddress(SOCKET_ADDRESS));

//发送写入数据
sender.getOutputStream().write(message.getBytes());

//关闭socket
sender.getOutputStream().close();

服务端:

//创建socket并绑定监听 新创建的
LocalServerSocket server = newLocalServerSocket(SOCKET_ADDRESS);
while (true) {
  //等待建立连接
  LocalSocket receiver =server.accept();

//接收获取数据流
  InputStream input =receiver.getInputStream();
…… }

参考文档:

http://hi.baidu.com/leoispace/item/ab4a271e6624824b6926bbe9

http://www.cnblogs.com/over140/archive/2011/11/22/2258372.html

http://blog.csdn.net/jamin0107/article/details/6832159

免责声明:文章转载自《Android中LocalSocket使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇《Debug Hacks》和调试技巧【转】meta标签下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux C++ Socket 高并发短连接 TIME_WAIT 挥之不去解决方法

近期遇到一个项目 需要在Linux上建立一个Socket 进行 HTTP_GET , 需要线程高并发的 使用TCP Socket 进行Send 发送HTTP_GET请求到 指定网站 . 而且不需要read数据返回 一旦Send完毕就直接close了, 但这样做却在本地产生了很多 TIME_WAIT 状态 导致端口堵塞无法高并发连接了 . 在网上找了很多资料...

详解tomcat的连接数与线程池

前言 在使用tomcat时,经常会遇到连接数、线程数之类的配置问题,要真正理解这些概念,必须先了解Tomcat的连接器(Connector)。 在前面的文章详解Tomcat配置文件server.xml中写到过:Connector的主要功能,是接收连接请求,创建Request和Response对象用于和请求端交换数据;然后分配线程让Engine(也就是Ser...

TCP协议粘包问题详解

TCP协议粘包问题详解前言   在本章节中,我们将探讨TCP协议基于流式传输的最大一个问题,即粘包问题。本章主要介绍TCP粘包的原理与其三种解决粘包的方案。并且还会介绍为什么UDP协议不会产生粘包。   基于TCP协议的socket实现远程命令输入   我们准备做一个可以在Client端远程执行Server端shell命令并拿到其执行结果的程序,而涉及...

docker.service启动失败:Unit not found的原因及解决办法

原因1:docker.socket 最初在启动docker时遇到问题,是因为docker.socket引起的,虽然记不清问题是表现为Unit not found还是执行systemctl start docker.service命令时hang住了,但是也一并记录在这里。 问题描述 我是从Docker 1.10.3升级到1.13.1版本,通过rpm包安装的。...

Socket 之 c#实现Socket网络编程

一、命名空间: 在网络环境下,最有用的两个命名空间是System.Net和System.Net.Sockets。 1、System.Net:通常与较高程的操作有关,例如download或upload,试用HTTP和其他协议进行Web请求等等 2、System.Net.Sockets:所包含的类通常与较低程的操作有关。如果要直接使用Sockets或者TCP/...

C#完整的通信代码(点对点,点对多,同步,异步,UDP,TCP)

原文引自:http://www.cnblogs.com/DebugLZQ/archive/2011/08/09/2132423.htmlC# code namespace UDPServer { class Program { static void Main(string[] args) { int recv; byte[] data = new byt...