Android中LocalSocket使用

2023-10-30

http://www.cnblogs.com/bastard/archive/2012/10/09/2717052.html

一 Socket

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

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

Tcp通信基本流程:

  服务器端                                                                       客户端

  1.创建socket                                                             1.创建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

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建立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 = new LocalSocket();

       //设置连接地址
       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 = new LocalSocket();
       l = new LocalSocketAddress(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
       class main
       socket myserver stream 600 system 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:

public LocalServerSocket(String name) throws IOException
{
        //创建socket资源
        impl = new LocalSocketImpl();
        impl.create(true);

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

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

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

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

  LocalServerSocket socket = new LocalServerSocket(createFileDescriptor(fileDesc));

public LocalServerSocket(FileDescriptor fd) throws IOException
{
        //已绑定 监听
        impl = new LocalSocketImpl(fd);
        impl.listen(LISTEN_BACKLOG);
        localAddress = impl.getSockAddress();
}

通常使用过程中:

客户端代码:

String message;

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

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

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

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

服务端:  

//创建socket并绑定监听 新创建的
LocalServerSocket server = new LocalServerSocket(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


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android中LocalSocket使用 的相关文章

  • Python tkinter如何把窗口在屏幕中央居中

    Python tkinter如何把窗口在屏幕中央居中 coding utf 8 import tkinter as tk 创建 Tkinter 窗口 root tk Tk 设置窗口大小 root geometry 400x300 获取屏幕宽
  • 企业微信消息多久可以撤回?企业微信怎么查看撤回的消息?

    大家都知道 个人微信是可以撤回两分钟以内的消息 超过两分钟就无法撤回了 那企业微信可以撤回发送了多久的消息呢 撤回的消息还能够查看吗 跟着企业微信服务商艾客scrm小编 一起来看看吧 其实 我们使用任何一个聊天工具聊天的过程中 撤回消息在所
  • Unity URP渲染管线与内置渲染管线的性能差别

    首先 我们来了解一下Unity的内置渲染管线 内置渲染管线是Unity较早版本中使用的默认渲染管线 它使用的是传统的图形渲染技术 内置渲染管线提供了一系列的渲染功能 如阴影 反射 抗锯齿等 但是 由于其较为庞大且复杂的设计 它的性能相对较低
  • qt动态显示当前时间如何实现

    Qt qt动态显示当前时间如何实现 vestinfo 1 票 182 include mainwindow h include ui mainwindow h include

随机推荐

  • Java面向对象编程

    第一章 类与对象 面向对象简介 面向过程指的是面对于一个问题的解决方案 更多情况下不会做出重用的设计 面向对象主要设计形式为模块化设计 可以进行重用配置 更多情p况下考虑的是标准 然后根据标准进行拼装 面向对象有三个主要特性 封装性 内部的
  • 【目标检测】Mask RCNN的训练数据集是什么?(含labelimg和labelme的讲解)

    文章目录 一 训练数据集 二 标注工具介绍 2 1 labelimg介绍 2 2 labelme介绍 2 3 两者的对比 三 制作数据案例 在看完何凯明大神的Mask RCNN的时候 突然想到了一个问题 那就是Mask RCNN的训练数据集
  • JAVA-使用Thumbnails压缩图片

    使用Thumbnails压缩图片
  • 休息是不可能休息的

    654 最大二叉树 分析 相比较遍历顺序构建二叉树 这个相对简单 思路 每次找到数组最大值 然后分割数组 class Solution public TreeNode judge vector
  • VersionCode和VersionName的区别

    最近在研究Android4 1的新功能 增量升级 判断客户端apk的版本号和服务器端的版本号在清单文件中VersionCode和VersionName的区别 记录一下 方便自己或者用到的朋友查看 先上结论 Google为APK定义了两个关于
  • 视频场景切换检测(镜头边界检测、镜头分割)

    个人简介 深度学习图像领域工作者 总结链接 链接中主要是个人工作的总结 每个链接都是一些常用demo 代码直接复制运行即可 包括 1 工作中常用深度学习脚本 2 torch numpy等常用函数详解 3 opencv 图片 视频等操作 4
  • 深入探索C++类的const成员函数

    深入探索C 类的const成员函数 const 成员变量的用法和普通 const 变量的用法相似 只需要在声明时加上 const 关键字 初始化 const 成员变量只有一种方法 就是通过构造函数的初始化列表 const 成员函数可以使用类
  • 【Unity】创建一个自己的AR脸部特效安卓程序

    目录 1 创建一个换脸AR场景 2 下载官方提供的BasicFaceFilterAssets资源 3 设置AR面部追踪 4 配置AR Face Manager 5 配置AR Camera为前置摄像头 6 打包并测试 7 添加自己的材质 7
  • oracle 多值更新,oracle 同时更新(update)多个字段多个值

    创建表A B create table A a1 varchar2 33 a2 varchar2 33 a3 varchar2 33 create table B b1 varchar2 33 b2 varchar2 33 b3 varch
  • pytest常用代码示例详细

    test case py usr bin env python3 coding utf 8 File test case py Author sunyajun Creation Time 2023 7 31 9 41 Description
  • C++ 标准库值操作迭代器的常见函数

    迭代器是C 标准库中的重要组件 特别是在容器内部 没有迭代器 容器也就无所谓存在了 例如 vector容器简而言之就是3个迭代器 start finish 以及end of storage vector的任何操作都离不开这3个迭代器 接下来
  • 关于COCO数据集评价参数设置

    在进行DETR like模型的实验过程中 考虑到原模型都是基于COCO数据集上进行的实验 因此博主在实验时也是将其全部都转换为COCO数据集的格式 但这就引发了一个问题 那就是不同的数据集中目标的数目是不同的 而最终结果却有一个不容忽视的指
  • 怎么升级Android Studio版本,Android Studio更新的四种版本介绍

    Android Studio在更新版本时 会有让选择升级源 如下 默认情况下选择的是Stable Channel 这几个Channel的版本是有一些差异的 在Android Studio下载官网上 有如下介绍 Android Studio
  • scrollIntoView() 方法的使用

    在 JavaScript 中 scrollIntoView 方法是用于将指定元素滚动到可见区域内的方法 该方法可以接收一个 options 对象参数 提供了滚动时的一些控制选项 如平滑滚动的行为 下面我们来介绍一个应用 scrollInto
  • tradingview

    文档地址 https b aitrade ga books tradingview index html 初始化 数据对接后的展示图 TV的数据格式 getbars time单位是S 10位数 ms的请除以1000 历史数据回来 塞给get
  • 我的世界进服务器显示C1.8-1.11,我的世界坐标显示(Batty's Coordinates PLUS)Mod

    Batty s Coordinates PLUS最好用的坐标显示Mod是为了你在游戏中方便的显示坐标或者帧数 这样你就不需要频繁的去按F3 并且还内置的定时器的功能 用法 在模式0坐标是隐藏的 模式1 显示了X Y Z坐标 也表明你面对的方
  • C# 添加Windows服务,定时任务。

    源码下载地址 http files cnblogs com files lanyubaicl 20160830Windows E6 9C 8D E5 8A A1 zip 步骤 一 创建服务项目 步骤二 添加安装程序 步骤三 服务属性设置 s
  • MATLAB中均值、方差、标准差、协方差、相关性的计算

    公式 1 均值 2 方差 3 标准差 均方差 4 协方差 5 相关性 6 加权均值 7 加权方差 8 加权标准差 MATLAB代码 样本定义 x 1 2 3 3 2 1 y 1 2 3 3 1 2 z 3 2 y 1 均值 均值 xmean
  • 搭建spring-cloud-alibaba微服务项目:springBoot服务+nacos注册中心+nacos配置中心+feign服务交互+gateway网关

    项目说明 从0 1 搭建cloud alibaba微服务项目 包括各个springBoot服务 nacos注册中心 nacos配置中心 feign服务交互 gateway网关 首先统一微服务种alibaba相关组件的依赖版本问题 官方参考文
  • Android中LocalSocket使用

    http www cnblogs com bastard archive 2012 10 09 2717052 html 一 Socket Socket最初用在基于TCP IP网络间进程通信中 以客户端 服务器模式进行通信 实现异步操作 共