Java NIO非堵塞应用通常适用用在I/O读写等方面,我们知道,系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,过去,在打开一个I/O通道后,read()将一直等待在端口一边读取字节内容,如果没有内容进来,read()也是傻傻的等,这会影响我们程序继续做其他事情,那么改进做法就是开设线程,让线程去等待,但是这样做也是相当耗费资源的。
Java NIO非堵塞技术实际是采取Reactor模式,或者说是Observer模式为我们监察I/O端口,如果有内容进来,会自动通知我们,这样,我们就不必开启多个线程死等,从外界看,实现了流畅的I/O读写,不堵塞了。
Java NIO出现不只是一个技术性能的提高,你会发现网络上到处在介绍它,因为它具有里程碑意义,从JDK1.4开始,Java开始提高性能相关的功能,从而使得Java在底层或者并行分布式计算等操作上已经可以和C或Perl等语言并驾齐驱。
简单说:使用java nio开发网络通讯 是比较快速和方面的。因为他可以不用阻塞的方式侦听客户端的连接 ,在java nio中可以使用基于事件的机制进行非阻塞通讯,当有新的事
件进行注册时 我们只需要通过事件侦听机制 获取新的事件
简单的说就是 java nio中里面有一个selector 异步 I/O 中的核心对象名为 Selector。Selector 就是您注册对各种 I/O 事件的兴趣的地方。
下面上代码,注释说明
package nio.socket;
import java.io.IOException;
import java.net.InetSocketAddress;
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;
import java.util.Set;
import org.junit.Test;
public class Server {
@Test
public void server() throws IOException {
//selector就是您注册对各种io事件的兴趣的地方 而且当那些事件发生时 就是这个对象告诉您所发生的事情
Selector selector = Selector.open();
//开启一个ServerSocketChannel通道
ServerSocketChannel ssc = ServerSocketChannel.open();
//绑定地址和端口
ssc.bind(new InetSocketAddress("localhost", 8080));
// 设置为非阻塞式的IO
ssc.configureBlocking(false);
//注册感兴趣的
ssc.register(selector, SelectionKey.OP_ACCEPT);
//设置一个缓冲
ByteBuffer buffer = ByteBuffer.allocate(1024);
//接收客户端过来的通道
SocketChannel sc = null;
while (true) {
selector.select(); //查询事件,监听一旦有我们注册的感兴趣的事件发生的时候便会激活
Set<SelectionKey> selectedKeys = selector.selectedKeys(); //获取到触发的事件集合
SelectionKey key = null;
Iterator<SelectionKey> iterator = selectedKeys.iterator();
for (;iterator.hasNext();) {//循环
key = iterator.next();
if(key.isAcceptable()){ //表示触发的事件是新连接
ServerSocketChannel newssc = (ServerSocketChannel) key.channel();
sc = newssc.accept(); //获取到客户端过来的通道
sc.configureBlocking(false); //设置为非阻塞式IO
sc.register(selector, SelectionKey.OP_READ);//注册读取事件
iterator.remove(); //事件集合中删除
System.out.println("有新的连接");
}else if(key.isReadable()){ //表示读取事件 在连接时候注册了读取事件 在这里处理
sc = (SocketChannel) key.channel(); //得到客户端的通道
while(true){
buffer.clear(); //如果信息量超过预设的缓存就会便会批量读取 重复使用 这里必须清理一下
int read = sc.read(buffer);
if(read == -1 || read == 0)break; //如果读取完了 则退出循环
if(read > 0){
byte[] array = buffer.array();
System.out.println("接受到的数据"+new String(array));
}
}
buffer.clear();
buffer.put("这是我的测试".getBytes());
buffer.flip();//flip方法将Buffer从写模式切换到读模式
sc.write(buffer);
sc.close();//使用完毕关闭客户端的通道
System.out.println("操作结束==============");
iterator.remove();
}
}
}
}
}
分享到:
相关推荐
java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java...
《NIO与Socket编程技术指南》是一本深入探讨Java NIO(New Input/Output)和Socket编程的专业书籍,由高洪岩撰写。本书主要针对Java开发者,旨在帮助他们理解和掌握这两种在开发网络应用中至关重要的技术。 Java ...
**Socket编程在NIO中的应用**: 1. **ServerSocketChannel**:用于监听客户端连接,通过调用`ServerSocketChannel.open()`创建,然后绑定到指定的IP和端口,并调用`accept()`方法接收客户端连接。 2. **...
Java Socket编程是网络编程的基础,它提供了在两个应用程序之间建立通信连接的能力。在这个场景中,我们讨论的是如何使用Java的Socket来实现文件上传功能,即从客户端将文件发送到服务器,然后保存到服务器的数据库...
总结,Java Socket编程是构建网络应用的关键技术。通过理解Socket的工作原理,掌握创建、连接、通信和关闭的基本步骤,以及处理异常和优化性能的方法,开发者可以构建出健壮且高效的网络应用程序。
### Java NIO 实现Socket通信详解 #### 一、NIO与传统IO的区别及优势 在探讨如何使用Java NIO实现Socket通信之前,我们需要先理解NIO(Non-blocking I/O,非阻塞I/O)与传统阻塞I/O之间的区别。 **传统阻塞I/O...
Java Socket和NIO(Non-blocking Input/Output,非阻塞I/O)是Java网络编程中的重要组成部分,它们在处理高并发、低延迟的网络服务时展现出强大的能力。本篇文章将深入探讨这两个概念,并通过示例代码`...
本资料包含的"Java源码:Socket编程"是一个示例,旨在帮助开发者理解并掌握Java中的Socket编程技术。 首先,Socket编程涉及的主要类有`ServerSocket`和`Socket`。`ServerSocket`类用于创建服务器端的监听套接字,它...
非常详细地讲解了NIO中的缓冲区、通道、选择器、编码,以及使用Socket技术实现TCP/IP和UDP编程,细化到了演示全部SocketOption的特性,这对理解基于NIO和Socket技术为基础所开发的NIO框架是非常有好处的,本书以案例...
在Java中,Socket编程是实现网络通信的基础,它提供了进程间通信的能力,使得两个相隔万里的计算机可以通过互联网进行数据交换。本篇文章将深入讲解如何通过三步学习Java Socket编程。 **第一步:理解Socket** ...
- **NIO(非阻塞I/O)**:Java NIO库提供了非阻塞的Socket编程模型,适用于高并发场景,如`Selector`和`Channel`。 7. **实践应用** - **聊天应用**:基于Socket的简单聊天室,客户端发送消息到服务器,服务器...
- 使用NIO(非阻塞I/O)可以通过`java.nio`包提高Socket编程的效率,特别是对于高并发场景。 - 使用缓冲区(Buffer)进行数据读写,减少系统调用次数。 7. **SSL/TLS安全通信**: - 对于需要加密和身份验证的...
在Java中,我们可以使用`java.net.Socket`类和`java.net.ServerSocket`类来实现TCP Socket编程。`ServerSocket`用于监听客户端的连接请求,`Socket`则代表一个客户端连接。以下是一个简单的TCP服务器端和客户端示例...
标题“nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio”表明这个压缩包包含了一个关于Java NIO的实例,特别是关于NIO套接字(Socket)的编程示例。NIO套接字是Java NIO库中用于网络通信的关键组件,它们允许...
- NIO(非阻塞I/O)的`java.nio`包提供了更高效的Socket编程模型,适用于高并发场景。 总之,Java的Socket编程提供了强大的能力来构建网络应用程序。通过理解`Socket`和`ServerSocket`类,以及如何使用它们进行...
Java Socket编程是网络通信的核心部分,它提供了进程间通信(IPC)的能力,使得运行在不同设备上的应用程序可以通过网络互相通信。在Java中,Socket主要分为两种模式:BIO(Blocking I/O)和NIO(Non-blocking I/O)...
输入输出流是用于数据读写的接口,是Socket编程中的核心概念之一。 6. 发送和接收数据 数据在发送和接收前需要进行编码和解码。信息编码包括基本整型、字符串和文本、位操作等。组合输入输出流允许同时读写多个...
本教程将深入探讨Java Socket编程的基本概念、原理和实践应用。 一、Socket基本概念 Socket,也被称为套接字,是网络通信中的一个重要接口,它为两台计算机提供了一个低级别的、进程到进程的通信机制。在Java中,...
在Java Socket编程中,NIO可以提供更高效、更灵活的网络通信方式,尤其适用于高并发的服务器应用。 标题中的“Java socketA_java nio_java socket a”可能是指使用Java NIO实现的Socket通信,这里的"A"可能是表示...