Selector(异步IO) TCP/IP
异步IO是一种没有阻塞的读写数据的方法,通过在Channel上注册Selector 的各种事件的地方,
当那些事件发生时,这个对象告诉您所发生的事件。
ServerSocketChannel,SocketChannel处理TCP/IP协议
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
public class SocketChannelServer {
private int PORT = 1234;
public ByteBuffer buffer = ByteBuffer.allocate(1024);
public static void main(String[] argv) throws IOException {
new SocketChannelServer().go();
}
public void go() throws IOException {
Selector selector = getSelector(PORT);
//第四步:内部处理
while (true) {
if (selector.select() == 0)
continue;
Iterator<SelectionKey> it = selector.selectedKeys().iterator();
while (it.hasNext()) {
SelectionKey key = (SelectionKey) it.next();
//第五步:监听事件并做出处理
if (key.isAcceptable()) {
sayWelcome(selector, key);
}
if (key.isReadable()) {
readData(key);
}
//第六步:删除处理过的SelectionKey
it.remove();
}
}
}
private void readData(SelectionKey key) throws IOException {
SocketChannel socketChannel = (SocketChannel) key.channel();
int count;
buffer.clear();
while ((count = socketChannel.read(buffer)) > 0) {
buffer.flip();
while (buffer.hasRemaining()) {
socketChannel.write(buffer);
System.out
.println("Get info: " + new String(buffer.toString()));
}
buffer.clear();
}
if (count < 0) {
socketChannel.close();
}
}
private void sayWelcome(Selector selector, SelectionKey key)
throws IOException {
ServerSocketChannel server = (ServerSocketChannel) key.channel();
SocketChannel channel = server.accept();
channel.configureBlocking(false);
channel.register(selector, SelectionKey.OP_READ);
System.out.println("Get connection from: "
+ channel.socket().getRemoteSocketAddress());
buffer.clear();
buffer.put("Hi Welcome!\r\n".getBytes());
buffer.flip();
channel.write(buffer);
}
private Selector getSelector(int port) throws IOException {
//第一步:创建一个Selector
Selector selector = Selector.open();
//第二步:打开一个远程连接
ServerSocketChannel serverChannel = ServerSocketChannel.open();
ServerSocket serverSocket = serverChannel.socket();
serverSocket.bind(new InetSocketAddress(PORT));
serverChannel.configureBlocking(false);
//第三步:选择键,注册
//SelectionKey中共定义了四种事件,
//OP_ACCEPT(socket accept)、OP_CONNECT(socket connect)、OP_READ(read)、OP_WRITE(write)
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
return selector;
}
}
测试: cmd telnet 127.0.0.1 1234
分享到:
相关推荐
Java IO、NIO以及NIO.2是Java中用于处理输入/输出操作的三种主要机制。本书《Java IO, NIO and NIO.2》旨在深入浅出地介绍这些机制,同时书中内容均为英文。接下来将详细介绍这些知识点。 **Java IO** Java IO是...
2. **缓冲区(Buffer)**:NIO的核心是缓冲区,它提供了一种存储和操作数据的高效方式。缓冲区类型包括ByteBuffer、CharBuffer、IntBuffer、DoubleBuffer等,它们都继承自`java.nio.Buffer`。 3. **选择器...
首先,理解NIO的基本概念是必要的。NIO中的“非阻塞”意味着当数据不可用时,读写操作不会被挂起,而是立即返回,这极大地提高了程序的效率。NIO的核心组件包括通道(Channels)、缓冲区(Buffers)和选择器...
### Pro Java 7 NIO2:深入理解Path类与文件系统操作 #### 一、引言 《Pro Java 7 NIO2》是一本专注于Java 7中的新I/O(NIO.2)特性的书籍,它介绍了如何利用Java 7的新特性来处理文件和网络操作。本书的核心在于...
在学习NIO时,首先需要理解Channel、Buffer、Selector的基本概念和使用方法,然后通过实例来熟悉它们的交互过程。例如,可以通过创建一个简单的服务器,使用ServerSocketChannel监听连接,SocketChannel处理客户端...
`NIOServer.java`和`NIOClient.java`这两个文件很可能是用于演示Java NIO服务器端和客户端的基本操作。下面将详细介绍Java NIO的主要组件和工作原理,并结合这两个文件名推测它们可能包含的内容。 1. **Selector...
2. 将Channel注册到Selector上,并指定感兴趣的事件(如读、写事件等)。 3. 调用Selector的`select()`方法等待事件的发生。如果没有任何事件发生,则此方法会阻塞直到有事件可用。 4. 一旦有事件发生,Selector...
缓冲区是NIO中数据存储的主要方式,它们是固定大小的数组,可以用于存储各种基本类型的数据,如字符、字节、整数等。在读写操作中,数据会先被存入缓冲区,然后再从缓冲区传输,这样可以提高效率。在这个聊天室应用...
2. **缓冲区(Buffers)**:缓冲区是数据操作的基本单位,所有对数据的操作都是通过缓冲区进行的。它们提供了一种在通道与应用程序之间存储数据的方式。 3. **选择器(Selectors)**:选择器允许单个线程监控多个...
本书《Java™ NIO》由 Ron Hitchens 编写,出版社为 O'Reilly,出版于2002年8月,ISBN号为0-596-00288-2,全书共有312页。 ### Java NIO 的优势 本书深入探讨了 Java 1.4 版本中的新 I/O 功能,并通过具体示例展示...
2. 文件操作:讲解如何使用NIO进行文件的读写操作,包括文件通道和MappedByteBuffer的使用。 3. 非阻塞I/O:对比NIO和BIO,解释非阻塞I/O的优势,并展示如何在实际项目中应用。 4. 多路复用:详述选择器的工作原理,...
《深入浅出NIO》 在Java编程领域,NIO(New Input/Output)是一种用于替代标准IO模型的机制,其核心在于非阻塞的I/O操作和通道(Channel)...通过理解NIO的基本概念和机制,我们可以构建出更高效、可扩展的应用程序。
### NIO 入门知识点详解 #### 一、NIO 的引入及其背景 - **NIO 的起源**:NIO(New Input/Output)库是在 JDK 1.4 中引入的,旨在解决传统 Java I/O 操作的局限性和性能瓶颈。 - **改进目标**:NIO 通过提供高速...
首先,理解Java NIO的基本概念非常重要。NIO中的“N”代表“非阻塞”,这意味着在进行I/O操作时,程序可以继续执行其他任务,而不是等待数据传输完成。NIO的核心组件包括通道(Channels)、缓冲区(Buffers)和选择...
以上是使用NIO实现邮件接收的基本原理和步骤,实际开发中还需要考虑性能优化、错误处理、多线程等问题。在"assignment2"这个压缩包文件中,可能包含了实现这一功能的具体代码,你可以参考学习,理解其中的逻辑和技巧...
#### 三、NIO实现Socket通信的基本流程 基于Java NIO的Socket通信流程大致如下: 1. **创建ServerSocketChannel**:服务器端首先需要创建一个`ServerSocketChannel`,用于监听客户端的连接请求。 2. **创建...
本篇内容将深入讲解NIO的核心概念以及基本的读写操作。 ### NIO核心概念 1. **通道(Channel)**:通道是NIO中的关键组件,它连接到I/O设备(如文件、网络套接字等)。通道可以读取或写入数据,且是双向的。例如,...