`
java_cofi
  • 浏览: 48785 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Android中LocalSocket使用

阅读更多
一 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://www.cnblogs.com/bastard/archive/2012/10/09/2717052.html
分享到:
评论

相关推荐

    socket_test.zip_android_android LocalSocket_socket

    在AndroidManifest.xml中,可能需要添加`<uses-permission android:name="android.permission.LOCAL_SOCKETS" />`权限,以便应用可以使用LocalSocket。 在实际开发中,LocalSocket常用于Android系统的组件间通信,...

    Android利用LocalSocket实现Java端进程与C端进程之间的IPC.doc

    Android利用LocalSocket实现Java端进程与C端进程之间的IPC

    C++与android通过socket通信(上个版本端口弄错了,这个可以运行)

    C++编写的服务器端跟android上编写的手机客户端进行socket通信,传动多种数据。用VC6.0直接打开C++ ...程序中java和C++的通信的内容使用了:http://download.csdn.net/detail/nuptboyzhb/4595415中的内容,在此感谢。

    Android MediaRecorder 录制视频 socket发送

    在本场景中,我们关注的是如何使用MediaRecorder录制视频并将其通过Socket发送到其他设备或服务器。以下是对这一主题的详细阐述: 1. **Android MediaRecorder**: - **初始化**:MediaRecorder实例化后,需要进行...

    Android NDK中socket的用法以及注意事项分析

    - 在Android NDK中使用socket编程时,确保正确处理错误情况,如`socket()`、`bind()`、`sendto()`、`recvfrom()`等函数返回的错误码。 - 使用`inet_addr()`将字符串IP转换为二进制形式时,注意无效IP会返回INADDR_...

    Android 音视频录制

    总结,Android音视频录制涉及MediaRecorder的使用、参数配置、录制流程控制,以及可能的LocalSocket流媒体录制。RecordDemo应该是一个实现这些功能的简单示例,对于理解Android音视频录制具有参考价值。对于...

    android Socket通信方法与思路

    在Android中,我们可以使用Java的Socket类和ServerSocket类进行网络通信。 1. **创建ServerSocket**: - 在服务器端,我们通常使用`ServerSocket`来监听特定的端口,等待客户端的连接请求。创建`ServerSocket`时,...

    Android的APN开发源码分析

    其创建过程是在ril.cpp文件中实现的,使用`android_get_control_socket(SOCKET_NAME_RIL)`获取。 2. **RILD的工作流程**: - 获取必要的参数。 - 打开功能库。 - 建立事件循环。 - 执行`RIL_Init`初始化。 - ...

    android APN开发流程

    在Android中,数据连接的建立主要分为两步:首先是通过AT命令激活PDP(Packet Data Protocol)连接,随后使用pppd(Point-to-Point Protocol Daemon)软件完成实际的拨号连接。 #### 二、关键组件剖析 **1. ...

    android_net_LocalSocketImpl.rar_android

    在Android系统中,`LocalSocketImpl` 是 `LocalSocket` 类的一个内部实现,用于处理本地域(即在同一设备上)进程间通信(IPC)。这种通信方式通常比基于网络的套接字更快、更安全,因为它不需要网络协议栈。 `...

    Android采用MediaRecorder进行录音和播放的源码

    在Android中,使用MediaRecorder进行录音通常包括以下步骤: 1. 初始化MediaRecorder对象:`MediaRecorder mediaRecorder = new MediaRecorder();` 2. 设置源(Source):在录音场景下,我们需要设置音频源,通常是...

    基于Android车载终端的设备管理框架设计

    为了实现对Android车载终端平台新增的许多非Android原生系统中的外围设备进行统一管理,本文提出了一种基于Android LocalSocket和Service的设备管理框架。该设备管理框架的整体层次结构包括应用程序、设备管理服务、...

    LocalServerSocket

    在`LocalSocketDemo`这个示例项目中,可能包含了客户端和服务器端的代码实现,展示了如何使用`LocalServerSocket`和`LocalSocket`进行简单的通信。可能的代码结构包括服务器端启动监听,等待客户端连接,客户端尝试...

    Android Studio出现Failed to pull selection: open failed: Permission denied的解决思路

    对此,解决办法是去到安卓的adb目录\Android\sdk\platform-tools下按住Shift右键“在此处打开命令行窗口”,进入命令行窗口后:需要操作的命令有: 1、adb shell进入shell模式 adb shell 2、获得所有root权限 su ...

    基于Android4.2系统的H.264视频数据的获取.pdf

    摘要中提到的问题是,在Android系统中,通常使用MediaRecorder和LocalSocket类来从MPEG4文件中提取H.264原始数据。然而,这种方法存在两个主要缺陷:一是需要手动填充SPS(Sequence Parameter Set)和PPS(Picture ...

    MediaRecorder获取H264数据

    在Android开发中,`MediaRecorder` 是一个非常重要的类,用于录制音频、视频或同时录制。在本场景中,我们关注的是如何通过 `MediaRecorder` 获取到H264编码的视频数据。H264,又称AVC(Advanced Video Coding),是...

    Android实时视频采集编码传输解码播放的方案调研.pdf

    2. **通过Android的MediaRecorder,在SetoutputFile函数中绑定LocalSocket实现**: - **原理**:利用`MediaRecorder`的输出功能,将其输出绑定到`LocalSocket`上,这样可以通过Socket实时传输视频流。 - **优点**...

    android实时监控

    2. 通过`MediaRecorder`结合`LocalSocket`,设置`setOutputFile`来捕获视频流。 3. 利用流媒体服务器,如ffmpeg或GetStreamer等,从Camera获取视频。 三、压缩编码 1. 原始数据传输:不编码,直接传输YUV420SP格式...

Global site tag (gtag.js) - Google Analytics