LocalSocketImpl介绍
Socket implementation used for android.net.LocalSocket and android.net.LocalServerSocket. Supports only AF_LOCAL sockets.
LocalSocketImpl该类主要用于和,目前仅支持使用本地地址规则来生成地址。AF_LOCAL介绍
常量
private SocketInputStream fis:继承InputStream类的本地输入流,当我们读入一些辅助数据时需要,内部read函数调用native函数实现相应功能。
private SocketOutputStream fos;继承OutputStream类的本地输出流
private Object readMonitor = new Object(); 作读入同步锁使用
private Object writeMonitor = new Object();作写入同步锁使用
private FileDescriptor fd;文件描述符
private boolean mFdCreatedInternally; 文件描述符是否被内部创建
FileDescriptor[] inboundFileDescriptors;接收预读取期间文件描述符数组
FileDescriptor[] outboundFileDescriptors;文件描述符数组,应该在下一次写入时写入
构造方法:
LocalSocketImpl()
空参构造方法
LocalSocketImpl(FileDescriptor fd)
通过文件描述符创建一个新的实例。此时在这里文件描述符不会被检查,但是调用者在通过listen调用时会进行验证socket状态。
常用方法:
public void create(int sockType)
通过socketType在当前的OS上创建一个socket,需要这个LocalServerSocket.accept()
public void close()
关闭当前的socket
protected void connect(LocalSocketAddress address, int timeout)
建立连接函数,注意超时,目前被忽略
public void bind(LocalSocketAddress endpoint)
使用endpoint名称绑定socket,只有在实例内体验被绑定时调用。
protected void listen(int backlog)
监听函数,底层实现使用Os.listen
protected void accept(LocalSocketImpl s)
从socket接收一个新的连接,在新的链接到来之前一直处于阻塞状态。
protected InputStream getInputStream()
通过当前的实例便利输入流
protected InputStream getOutputStream()
通过当前的实例便利输出流
protected int available()
返回读过程中可用字节的值
protected void shutdownInput()
关闭输入流
protected void shutdownOutput()
关闭输出流
public Object getOption(int optID)
获取socket属性值,包括SocketOptions.SO_LINGER、SocketOptions.SO_TIMEOUT、SocketOptions.SO_RCVBUF、SocketOptions.SO_SNDBUF、SocketOptions.SO_REUSEADDR和SocketOptions.TCP_NODELAY。
public Object setOption(int optID)
设置socket属性值。
public void setFileDescriptorsForSend(FileDescriptor[] fds)
利用一个set集合发送文件描述符到监控点。
public FileDescriptor[] getAncillaryFileDescriptors()
遍历通过辅助信息发送的文件描述符set集合。
public LocalSocketAddress getSockAddress()
返回os的socket名称,但是这个方法没有实现,返回值为null。
总结
LocalSocket
在LocalSocket中,使用LocalSocketImpl创建了LocalSocket对象,通过使用封装过的bind和connect函数进行客户端Socket的创建,使用输出输出流来进行数据传递。
在开发中一般很少使用到bind函数,当客户端准备完成,使用connect函数,传入服务器端准备好的套接字域名即可进行连接,之后使用输入输出流进行数据传递。
LocalServerSocket
在LocalServerSocket中,使用更加简单,在构造方法中已经进行了客户端域名的bind和listen,使用accept函数进行客户端连接获取LocalSocket实例即可使用输入输出流进行数据交换。
服务器端开发需要注意多线程接收,因为accept函数是阻塞的,当一个连接在等待处理时,如果是不设置多线程处理,其他连接到来时就不能处理。