NIO服务端代码:
public class NIOServer {
private Selector selector;
public void startServer(int port) throws IOException {
ServerSocketChannel serverChannel = ServerSocketChannel.open();
// 设置通道为非阻塞
serverChannel.configureBlocking(false);
serverChannel.socket().bind(new InetSocketAddress(port));
this.selector = Selector.open();
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
}
public void listen() throws IOException {
while (true) {
//当注册的事件到达时,方法返回;否则,该方法会一直阻塞
selector.select();
Iterator<SelectionKey> it = this.selector.selectedKeys().iterator();
while (it.hasNext()) {
SelectionKey key = (SelectionKey) it.next();
// 此处一定要删除
it.remove();
if (key.isAcceptable()) {
ServerSocketChannel server = (ServerSocketChannel) key
.channel();
SocketChannel channel = server.accept();
System.out.println("remote socket is:"+channel.socket().getInetAddress());
channel.configureBlocking(false);
channel.write(ByteBuffer.wrap(new String("send one msg to client").getBytes()));
channel.register(this.selector, SelectionKey.OP_READ);
} else if (key.isReadable()) {
read(key);
}
}
}
}
public void read(SelectionKey key) throws IOException{
SocketChannel channel = (SocketChannel) key.channel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
int len = channel.read(buffer);
byte[] data = new byte[len];
System.arraycopy(buffer.array(), 0, data, 0, len);
String msg = new String(data).trim();
System.out.println("server receive one msg:"+msg);
ByteBuffer outBuffer = ByteBuffer.wrap(msg.getBytes());
channel.write(outBuffer);
}
public static void main(String[] args) throws IOException {
NIOServer server = new NIOServer();
server.startServer(8080);
server.listen();
}
}
NIO客户端代码:
public class NIOClient {
private Selector selector;
public void initClient(String ip,int port) throws IOException {
SocketChannel channel = SocketChannel.open();
channel.configureBlocking(false);
this.selector = Selector.open();
channel.connect(new InetSocketAddress(ip,port));
channel.register(selector, SelectionKey.OP_CONNECT);
}
public void listen() throws IOException {
while (true) {
selector.select();
Iterator<SelectionKey> it = this.selector.selectedKeys().iterator();
while (it.hasNext()) {
SelectionKey key = (SelectionKey) it.next();
it.remove();
if (key.isConnectable()) {
SocketChannel channel = (SocketChannel) key.channel();
if(channel.isConnectionPending()){
channel.finishConnect();
}
channel.configureBlocking(false);
channel.write(ByteBuffer.wrap(new String("你在他乡还好吗").getBytes()));
channel.register(this.selector, SelectionKey.OP_READ);
} else if (key.isReadable()) {
read(key);
}
}
}
}
public void read(SelectionKey key) throws IOException{
SocketChannel channel = (SocketChannel) key.channel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
int len = channel.read(buffer);
byte[] data = new byte[len];
System.arraycopy(buffer.array(), 0, data, 0, len);
String msg = new String(data).trim();
System.out.println("client receive one msg:"+msg);
ByteBuffer outBuffer = ByteBuffer.wrap(msg.getBytes());
}
public static void main(String[] args) throws IOException {
NIOClient client = new NIOClient();
client.initClient("localhost",8080);
client.listen();
}
}
分享到:
相关推荐
这些示例通常会包含简单的读写文件、服务器端与客户端的通信以及多路复用的使用,帮助初学者快速理解NIO的工作原理和实际应用。在学习过程中,你可以逐步深入,从基础的Buffer操作到复杂的Selector机制,掌握Java ...
myeclipse开发通信示例,框架netty,代码本人写的,而且已测试通过,先运行NettyService,再运行NettyClient即可看到效果。nio示例也有,原理一样,运行先后顺序同netty.
四、NIO示例代码 在`nio-src.rar`中可能包含了以下类型的示例代码: 1. **文件读写示例**:演示如何使用FileChannel进行文件的读取和写入,可能会包含`transferTo()`和`transferFrom()`等方法的使用。 2. **网络通信...
带有 JDK 的 NIO 示例 HTTP 服务器 使用以下命令也使用 Maven build 构建项目 mvn clean install 使用以下 Maven 构建命令构建具有依赖库的项目 mvn clean assembly:assembly 从位于目标文件夹下的构建 jar 执行...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种I/O模型,旨在提供一种更高效、更具弹性的I/O处理方式。相比于传统的BIO( Blocking I/O)模型,NIO在处理高并发和大...
- **NIO示例**:演示了如何使用Java NIO进行非阻塞I/O操作。 - **Netty基础功能**:包括服务器启动、客户端连接、数据传输、心跳检测、异常处理等。 - **高级特性**:可能涵盖了Netty的ChannelHandlerContext、...
压缩包中的"dsapp"可能是某种数据服务应用程序的名称,它可能使用了NIO技术来提高其I/O性能,或者是一个包含NIO示例代码的文件夹。如果能够访问这个文件,我们可以学习到具体的代码实现,进一步了解NIO在实际编程中...
**NIO示例:** ```java Selector selector = Selector.open(); ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); serverSocketChannel.bind(new InetSocketAddress(8080)); ...
#### 五、Java NIO 示例 ##### Channel和Buffer操作示例 ```java // 创建一个FileChannel FileChannel fileChannel = new FileInputStream(file).getChannel(); // 创建一个ByteBuffer ByteBuffer buffer = ...
下面是一个简单的 Java NIO 示例,展示了如何使用 `FileChannel` 和 `ByteBuffer` 进行文件复制: ```java package nio; import java.io.FileInputStream; import java.io.FileOutputStream; import java.nio....
通过NIO示例代码,我们可以学习如何创建通道、选择器,以及如何进行异步的数据读写。 4. **并发编程**:Java并发编程是Java SE中的一个重要领域,涉及线程、同步、锁、原子变量、并发容器等。Java提供了丰富的并发...
在实际操作中,运行NIO示例代码需要一些基本配置: - 安装JDK1.4或以上版本,并将其路径设置好以便能够使用命令行编译和运行Java程序。 - Windows系统下可以使用“Command”或者“***”命令提示符,而在UNIX系统下...
NIO示例则可能使用Selector、ServerSocketChannel和SocketChannel进行编程。 **应用场景** - **BIO**:适用于简单的服务器,如早期的Tomcat服务器,以及需要低延迟、高响应的单线程或少量连接的应用。 - **NIO**:...
以上就是Java NIO的基础使用示例。通过这种方式,服务器可以高效地处理来自多个客户端的连接请求,而不需要为每个客户端创建单独的线程,降低了系统的资源消耗。值得注意的是,Java NIO的API相对复杂,使用时需要...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,它为Java应用程序提供了更高效、灵活的I/O操作方式。NIO与传统的 Blocking I/O(阻塞I/O)模式相比,...
4. NIO示例: - NIO读取文件示例中,使用FileChannel从文件中读取数据,通过`channel.read(buffer)`将数据读入Buffer,而不是直接读到字节数组,这样可以批量读取,提高效率。 ```java public void nioRead(String...
本文将深入探讨NIO原生API的示例,基于提供的"ServerImpCopy.java"文件名,我们可以推测这是一个关于服务器端NIO实现的示例代码。 在Java NIO中,核心组件包括通道(Channels)、缓冲区(Buffers)和选择器...
4. NIO示例: 与传统的IO相比,NIO在读取文件内容时,可以使用`FileChannel`和`ByteBuffer`。`FileChannel`可以从文件中读取数据到缓冲区,然后从缓冲区获取数据,而不是直接从文件流中读取。这种方式减少了数据...
"Java使用BIO和NIO进行文件操作对比代码示例" Java BIO和NIO是两种不同的输入/输出(IO)模型,在文件操作中发挥着重要作用。BIO(Blocking I/O)是一种同步阻塞IO模式,而NIO(Non-Blocking I/O)是一种同步非阻塞...
xsocket NIO框架示例 resources 中有相关的 资料。telnet服务测试教程。和相关jar