美文网首页
LocalSocket

LocalSocket

作者: gbmaotai | 来源:发表于2018-10-23 09:21 被阅读0次

LocalSocket

在Unix域名空间创建一个套接字(非服务端)。
  是对Linux中Socket进行了封装,采用JNI方式调用,实现进程间通信。
  具体就是Native层Server和Framework层Client之间进行通信,或在各层次中能使用Client/Server模式实现通信。

LocalServerSocket

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

LocalSocketImpl

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

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

socket_create

socket_connect_local

socket_bind_local

socket_listen

增加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时完成:

        for (si = svc->sockets; si; si = si->next) {
            int socket_type = (
                    !strcmp(si->type, "stream") ? SOCK_STREAM :
                        (!strcmp(si->type, "dgram") ? SOCK_DGRAM : SOCK_SEQPACKET));
            int s = create_socket(si->name, socket_type,
                                  si->perm, si->uid, si->gid);
            if (s >= 0) {
                publish_socket(si->name, s);
            }
        }

native层

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);
    }
}             
class FrameworkListener : public SocketListener {
public:
    static const int CMD_ARGS_MAX = 16;
private:
    FrameworkCommandCollection *mCommands;
 
public:
    FrameworkListener(const char *socketName);
    virtual ~FrameworkListener() {}
 
protected:
    void registerCmd(FrameworkCommand *cmd);
    virtual bool onDataAvailable(SocketClient *c);
 
private:
    void dispatchCommand(SocketClient *c, char *data);
};
bool FrameworkListener::onDataAvailable(SocketClient *c) {
    char buffer[255];
    int len;
 
    if ((len = read(c->getSocket(), buffer, sizeof(buffer) -1)) < 0) {
        SLOGE("read() failed (%s)", strerror(errno));
        return errno;
    } else if (!len)
        return false;
 
    int offset = 0;
    int i;
 
    for (i = 0; i < len; i++) {
        if (buffer[i] == '\0') {
            dispatchCommand(c, buffer + offset);
            offset = i + 1;
        }
    }
    return true;
}

framework层

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

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

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

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

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

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

相关文章

  • Android跨进程通讯之LocalSocket和LocalSe

    先贴上LocalSocket的代码: 获取localSocket的输入输出流: 写入数据: 接收数据: 至此,Lo...

  • LocalSocket

    LocalSocket 在Unix域名空间创建一个套接字(非服务端)。是对Linux中Socket进行了封装,采用...

  • Android LocalSocket使用

    一、概述 LocalSocket可以在Android上实现跨进程的通信;区分服务端和客户端,服务端需要监听客户端发...

  • IPC通信方式之LocalSocket

    人生有八苦:生,老,病,死,爱别离,怨长久,求不得,放不下。 LocalSocket是什么 在弄清LocalSoc...

  • iOS进程通信之LocalSocket

    iOS进程通信 在iOS中,进程通信的方式有很多种;下面先列举下常用的几种方式: URL scheme Keych...

  • 安卓IPC机制之LocalSocket

    LocalSocket作为安卓提供的一种IPC机制,可能应用层的同学比较陌生,我实际也是在这段时间做项目使用到才注...

网友评论

      本文标题:LocalSocket

      本文链接:https://www.haomeiwen.com/subject/vvdozftx.html