Android NIO Socket实现流程
1. 创建SocketChannel对象
首先,需要创建一个SocketChannel对象来建立与服务器的连接。可以通过open()
方法创建一个SocketChannel对象,然后使用connect()
方法连接到服务器的IP地址和端口号。
SocketChannel socketChannel = SocketChannel.open();
socketChannel.configureBlocking(false); // 设置为非阻塞模式
socketChannel.connect(new InetSocketAddress(serverIP, serverPort)); // 连接到服务器
2. 检查连接状态
可以使用finishConnect()
方法来检查SocketChannel是否连接成功。如果连接成功,则可以进行读写操作;如果连接未完成,则需要等待连接完成。
if (socketChannel.finishConnect()) {
// 连接成功,进行读写操作
} else {
// 连接未完成,等待连接完成
}
3. 注册选择器
在进行读写操作之前,需要将SocketChannel注册到选择器(Selector)中,以便进行事件监听。可以通过register()
方法将SocketChannel注册到选择器,并指定感兴趣的事件,例如读事件和写事件。
Selector selector = Selector.open();
socketChannel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);
4. 监听事件
通过选择器的select()
方法监听感兴趣的事件。可以通过SelectionKey
对象获取到就绪的通道和事件类型。
selector.select(); // 阻塞,等待就绪事件
Set<SelectionKey> selectedKeys = selector.selectedKeys();
Iterator<SelectionKey> iterator = selectedKeys.iterator();
while (iterator.hasNext()) {
SelectionKey key = iterator.next();
if (key.isReadable()) {
// 可读事件就绪,进行读取操作
}
if (key.isWritable()) {
// 可写事件就绪,进行写入操作
}
iterator.remove();
}
5. 读取数据
在可读事件就绪后,可以通过SocketChannel
的read()
方法读取服务器发送的数据。
ByteBuffer buffer = ByteBuffer.allocate(1024);
int bytesRead = socketChannel.read(buffer); // 读取数据到缓冲区
if (bytesRead == -1) {
// 通道已关闭
} else if (bytesRead > 0) {
buffer.flip(); // 切换到读模式
byte[] data = new byte[buffer.remaining()];
buffer.get(data); // 读取数据到字节数组
String message = new String(data);
// 处理接收到的消息
}
6. 写入数据
在可写事件就绪后,可以通过SocketChannel
的write()
方法将数据写入到服务器。
String message = "Hello, Server!";
ByteBuffer buffer = ByteBuffer.wrap(message.getBytes()); // 将消息转换为字节缓冲区
socketChannel.write(buffer); // 写入数据到通道
7. 关闭连接
当通信结束后,需要关闭SocketChannel和Selector对象。
socketChannel.close(); // 关闭SocketChannel
selector.close(); // 关闭Selector
以上就是使用Android NIO Socket实现的基本流程。根据需要,可以根据具体业务逻辑进行扩展和优化。
标签:nio,iterator,buffer,连接,socketChannel,事件,android,SocketChannel,socket From: https://blog.51cto.com/u_16175494/6832973注意:以上代码只是示例,实际使用时还需要进行异常处理、资源释放等操作。