Android localSocket

转载地址:http://www.cnblogs.com/bastard/archive/2012/10/09/2717052.html

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

  ……

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

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

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

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

建立的服务端socket资源在Linux域空间不同而已,过程是一样的跟一般的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();
  
  ……
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值