一 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
分享到:
相关推荐
在AndroidManifest.xml中,可能需要添加`<uses-permission android:name="android.permission.LOCAL_SOCKETS" />`权限,以便应用可以使用LocalSocket。 在实际开发中,LocalSocket常用于Android系统的组件间通信,...
Android利用LocalSocket实现Java端进程与C端进程之间的IPC
C++编写的服务器端跟android上编写的手机客户端进行socket通信,传动多种数据。用VC6.0直接打开C++ ...程序中java和C++的通信的内容使用了:http://download.csdn.net/detail/nuptboyzhb/4595415中的内容,在此感谢。
在本场景中,我们关注的是如何使用MediaRecorder录制视频并将其通过Socket发送到其他设备或服务器。以下是对这一主题的详细阐述: 1. **Android MediaRecorder**: - **初始化**:MediaRecorder实例化后,需要进行...
- 在Android NDK中使用socket编程时,确保正确处理错误情况,如`socket()`、`bind()`、`sendto()`、`recvfrom()`等函数返回的错误码。 - 使用`inet_addr()`将字符串IP转换为二进制形式时,注意无效IP会返回INADDR_...
总结,Android音视频录制涉及MediaRecorder的使用、参数配置、录制流程控制,以及可能的LocalSocket流媒体录制。RecordDemo应该是一个实现这些功能的简单示例,对于理解Android音视频录制具有参考价值。对于...
在Android中,我们可以使用Java的Socket类和ServerSocket类进行网络通信。 1. **创建ServerSocket**: - 在服务器端,我们通常使用`ServerSocket`来监听特定的端口,等待客户端的连接请求。创建`ServerSocket`时,...
其创建过程是在ril.cpp文件中实现的,使用`android_get_control_socket(SOCKET_NAME_RIL)`获取。 2. **RILD的工作流程**: - 获取必要的参数。 - 打开功能库。 - 建立事件循环。 - 执行`RIL_Init`初始化。 - ...
在Android中,数据连接的建立主要分为两步:首先是通过AT命令激活PDP(Packet Data Protocol)连接,随后使用pppd(Point-to-Point Protocol Daemon)软件完成实际的拨号连接。 #### 二、关键组件剖析 **1. ...
在Android系统中,`LocalSocketImpl` 是 `LocalSocket` 类的一个内部实现,用于处理本地域(即在同一设备上)进程间通信(IPC)。这种通信方式通常比基于网络的套接字更快、更安全,因为它不需要网络协议栈。 `...
在Android中,使用MediaRecorder进行录音通常包括以下步骤: 1. 初始化MediaRecorder对象:`MediaRecorder mediaRecorder = new MediaRecorder();` 2. 设置源(Source):在录音场景下,我们需要设置音频源,通常是...
为了实现对Android车载终端平台新增的许多非Android原生系统中的外围设备进行统一管理,本文提出了一种基于Android LocalSocket和Service的设备管理框架。该设备管理框架的整体层次结构包括应用程序、设备管理服务、...
在`LocalSocketDemo`这个示例项目中,可能包含了客户端和服务器端的代码实现,展示了如何使用`LocalServerSocket`和`LocalSocket`进行简单的通信。可能的代码结构包括服务器端启动监听,等待客户端连接,客户端尝试...
对此,解决办法是去到安卓的adb目录\Android\sdk\platform-tools下按住Shift右键“在此处打开命令行窗口”,进入命令行窗口后:需要操作的命令有: 1、adb shell进入shell模式 adb shell 2、获得所有root权限 su ...
摘要中提到的问题是,在Android系统中,通常使用MediaRecorder和LocalSocket类来从MPEG4文件中提取H.264原始数据。然而,这种方法存在两个主要缺陷:一是需要手动填充SPS(Sequence Parameter Set)和PPS(Picture ...
在Android开发中,`MediaRecorder` 是一个非常重要的类,用于录制音频、视频或同时录制。在本场景中,我们关注的是如何通过 `MediaRecorder` 获取到H264编码的视频数据。H264,又称AVC(Advanced Video Coding),是...
2. **通过Android的MediaRecorder,在SetoutputFile函数中绑定LocalSocket实现**: - **原理**:利用`MediaRecorder`的输出功能,将其输出绑定到`LocalSocket`上,这样可以通过Socket实时传输视频流。 - **优点**...
2. 通过`MediaRecorder`结合`LocalSocket`,设置`setOutputFile`来捕获视频流。 3. 利用流媒体服务器,如ffmpeg或GetStreamer等,从Camera获取视频。 三、压缩编码 1. 原始数据传输:不编码,直接传输YUV420SP格式...