浅析NIO系列之TCP攻略
什么是NIO
NIO(New IO)是Java自从1.4版本后提供的新IO API,可以更快的进行IO操作和更多的IO操作,这与以前的IO API相比较是一个很大的改进。
NIO最核心的是Channel、Buffer和Selector。
什么是TCP
TCP(Transmission Control Protocol)即传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层协议,数据传输前必须构建TCP连接。
NIO与TCP的关系
NIO可以更好地控制TCP连接,即通过NIO的Channel、Buffer和Selector来优化传输TCP协议数据的调度。
TCP和NIO之间的关系可以通过下方示例来理解。
NIO实现TCP的示例一
- 利用NIO的Channel和Buffer来实现TCP协议的数据发送和接受。
try {
//1.创建Selector和Channel
Selector selector = Selector.open();
ServerSocketChannel ssChannel = ServerSocketChannel.open();
ssChannel.configureBlocking(false);
ssChannel.bind(new InetSocketAddress(8080));
ssChannel.register(selector, SelectionKey.OP_ACCEPT);
//2.监听
while (selector.select() > 0) {
//3.获取选择器上所有的key,并处理
Iterator<SelectionKey> it = selector.selectedKeys().iterator();
while (it.hasNext()) {
SelectionKey sk = it.next();
//4.判断是什么事件
if (sk.isAcceptable()) {
//5.若为接受事件,创建SocketChannel
SocketChannel sChannel = ssChannel.accept();
sChannel.configureBlocking(false);
sChannel.register(selector, SelectionKey.OP_READ);
} else if (sk.isReadable()) {
//6.若为读取事件,读取数据
SocketChannel sChannel = (SocketChannel) sk.channel();
ByteBuffer buf = ByteBuffer.allocate(1024);
int len = 0;
while ((len = sChannel.read(buf)) > 0) {
buf.flip();
System.out.println(new String(buf.array(), 0, len));
buf.clear();
}
}
//7.取消选择键SelectionKey
it.remove();
}
}
} catch (IOException e) {
e.printStackTrace();
}
上述代码是一个服务端代码,通过NIO的Channel和Buffer来实现TCP协议的数据发送和接受。其中,主要的操作包含如下:
- 创建Selector和Channel
- 监听
- 获取选择器上所有的key,判断是什么事件
- 若为接受事件,创建SocketChannel
- 若为读取事件,读取数据
- 取消选择键SelectionKey
NIO实现TCP的示例二
- 利用NIO的Channel、Buffer和Selector来实现TCP协议的数据发送和接受。
try {
SocketChannel socketChannel = SocketChannel.open();
socketChannel.connect(new InetSocketAddress("localhost", 8080));
socketChannel.configureBlocking(false);
ByteBuffer buffer = ByteBuffer.allocate(1024);
buffer.put("Hello, World".getBytes());
buffer.flip();
while (buffer.hasRemaining())
socketChannel.write(buffer);
buffer.clear();
} catch (IOException e) {
e.printStackTrace();
}
上述代码是一个客户端代码,通过NIO的Channel、Buffer和Selector来实现TCP协议的数据发送和接受。其中,主要的操作包含如下:
- 创建SocketChannel
- 连接指定的IP和端口
- 写入数据
- 清空缓冲区
总结
NIO提供了更丰富的IO操作方式,可以更好的控制TCP连接,通过上述示例,我们可以更深入地理解NIO与TCP的关系,以及如何在Java中使用NIO实现TCP协议的数据发送和接受。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅析NIO系列之TCP - Python技术站