1、什么是Netty
Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。
也就是说,Netty 是一个基于NIO的客户,服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。Netty相当简化和流线化了网络应用的编程开发过程,例如,TCP和UDP的socket服务开发。
2、什么是NIO
Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。也有人将NIO 称之为 Non-block I/O (非阻塞I/O),貌似这个称呼更能体现NIO与传统IO的区别。
Java NIO提供了与标准IO不同的IO工作方式:
① Channels and Buffers(通道和缓冲区):标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。
② Asynchronous IO(异步IO):Java NIO可以让你异步的使用IO,例如:当线程从通道读取数据到缓冲区时,线程还是可以进行其他事情。当数据被写入到缓冲区时,线程可以继续处理它。从缓冲区写入通道也类似。
③Selectors(选择器):Java NIO引入了选择器的概念,选择器用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个的线程可以监听多个数据通道。
详细请参考《Java NIO 系列教程》
3、Netty给我们解决了什么问题
功能强大,简化了NIO开发,Netty 是一个异步的,事件驱动的网络编程框架,使用它能够快速开发出高性能的、可维护性较强的、可扩展性较强的协议服务的服务端和客户端。
4、示例 标准IO
服务端
TimeServer:
package com.techstar.io;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
* Server
* @author mrh
*
*/
public class TimeServer {
/**
* 启动服务
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
int port = 8081;
ServerSocket server = null;
try {
server = new ServerSocket(port);
System.out.println("TimeServer is started .......");
Socket socket = null;
while(true) {
socket = server.accept();
new Thread(new TimeServerHandler(socket)).start();
}
} finally {
if (server != null) {
System.out.println("The TimeServer is closed .......");
server.close();
}
}
}
}
TimeServerHandler
package com.techstar.io;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Date;
public class TimeServerHandler implements Runnable{
private Socket socket;
public TimeServerHandler(Socket socket) {
super();
this.socket = socket;
}
@Override
public void run() {
BufferedReader reader = null;
PrintWriter writer = null;
try {
reader = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
writer = new PrintWriter(this.socket.getOutputStream(), true);
String currentTime = null;
String body = null;
while(true) {
body = reader.readLine();
if (body == null)
break;
System.out.println("The time server receive order:" + body);
currentTime = "QUERY TIME ORDER".equals(body)?new Date(System.currentTimeMillis()).toString() : "BAD ORDER";
writer.println(currentTime);
writer.flush();
}
} catch (Exception e) {
if (writer != null) {
writer.close();
writer = null;
}
if (reader != null) {
try {
reader.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
if (this.socket != null) {
try {
this.socket.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
this.socket = null;
}
}
}
}
客户端:
package com.techstar.io;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class TimeClient {
public static void main(String[] args) {
int port = 8081;
BufferedReader reader = null;
PrintWriter writer = null;
Socket socket = null;
try {
socket = new Socket("127.0.0.1", port);
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new PrintWriter(socket.getOutputStream(), true);
writer.println("QUERY TIME ORDER");
writer.flush();
System.out.println("send order to server successed!");
String response = reader.readLine();
System.out.println("Now is " + response);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (writer != null) {
writer.close();
writer = null;
}
if (reader != null) {
try {
reader.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
if (socket != null) {
try {
socket.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
socket = null;
}
}
}
}
5、 Linux网络 I/O 模型简介
① 阻塞 I/O 模型
最常用的 I/O 模型就是阻塞 I/O 模型, 缺省情形下, 所有文件操作都是阻塞的。如下图所示
优劣:简单,效率低
② 非阻塞 I/O 模型
理解了阻塞I/O,非阻塞I/O就好理解。非阻塞I/O是程序执行过程中,I/O操作不会阻塞程序的执行,也就是在I/O操作的同时,继续执行其他代码(这得益于Node的事件循环机制)。在I/O设备效率还远远低于CPU效率的时代,这种I/O模型(非阻塞I/O)为程序带来的性能上的提高是非常可观的
优劣:效率高,复杂
③ I/O 复用模型
让应用程序可以同时对多个I/O端口进行监控以判断其上的操作是否可以进行,达到时间复用的目的。在书上看到一个例子来解释I/O的原理,我觉得很形象,如果用监控来自10根不同地方的水管(I/O端口)是否有水流到达(即是否可读),那么需要10个人(即10个线程或10处代码)来做这件事。如果利用某种技术(比如摄像头)把这10根水管的状态情况统一传达到某一点,那么就只需要1个人在那个点进行监控就行了,而类似与select或epoll这样的多路I/O复用机制就好比是摄像头的功能,它们能够把多个I/O端口的状况反馈到同一处,比如某个特定的文件描述符上,这样应用程序只需利用对应的select()或epoll_wait()系统调用阻塞关注这一处即可。
优劣:由于I/O多路复用是在单一进程的上下文中的,因此每个逻辑流程都能访问该进程的全部地址空间,所以开销比多进程低得多;缺点是编程复杂度高
④ 信号驱动 I/O 模型
让内核在描述字就绪时发送SIGIO信号通知我们。首先开启套接口的信号驱动1/O功能,sigaction系统调用安装一个信号处理函数,当内核数据包准备好时,会为该进程产生一个SIGIO信号。
⑤ 异步 I/O告知内核启动某个操作,并让内核在整个操作完成后(包括将数据从内核复制到用户自己的缓冲区)通知我们。与信号模型的区别就在于:信号驱动IO由内核通知我们何时可以开始下一个IO操作;异步I/O模型由内核通知我们I/O操作何时完成。
6、NIO的主要组件
① Buffer
缓冲区, 几乎每种Java数据类型都有一个
② Channel
数据就是一个通道, 网络数据通过Channel读取写入。与传统的IO不同, 它是双向的,允许同时进行读写操作。
③ Selector
NIO的基础,掌握Selector的熟练度,就决定了对NIO编程的熟练度。
Selector(选择器)能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件。这样,一个单独的线程可以管理多个channel,从而管理多个网络连接。
好处:
仅用单个线程来处理多个Channels的好处是,只需要更少的线程来处理通道
- 大小: 21.6 KB
- 大小: 26.4 KB
- 大小: 5.9 KB
分享到:
相关推荐
这个“Netty 讲义.zip”压缩包包含了一系列关于 Netty 的学习资料,主要分为四个部分:入门、进阶、NIO 和优化与源码分析。 首先,我们来探讨 Netty 的入门知识。`Netty02-入门.md` 可能会涵盖以下内容:Netty 的...
### Java Netty 入门教程知识点详解 #### 1. Netty 概览 ##### 1.1 Netty 是什么? Netty 是一款基于 Java 的高性能网络应用框架,支持多种协议,包括但不限于 HTTP、FTP、SMTP 等,并且特别擅长处理 TCP 和 UDP ...
NettyInAction中文版,共13章,从入门到精通。Netty介绍 为什么要使用non-blocking IO(NIO) 阻塞IO(blocking IO)和非阻塞IO(non-blocking IO)对比 Java NIO的问题和在Netty中的解决方案 Netty是基于Java NIO的网络...
《Netty+入门与实战:仿写微信+IM+即时通讯系统》是一本专注于使用Netty框架构建即时通讯系统的教程。Netty是一个高性能、异步事件驱动的网络应用框架,适用于开发服务器和客户端的Java应用。它极大地简化了网络编程...
3. **Netty入门** - **概述**:Netty由JBOSS创始人Jochen Meskel开发,它具有高性能、低延迟、易用性等优点,广泛应用于分布式系统、游戏服务器、RPC框架等领域。 - **HelloWorld**:Netty的基本使用包括服务器端...
这个“netty入门例子”旨在帮助初学者理解Netty的基本用法和特性,而不是简单地翻译官方文档,它提供了几个开发模板,以便于深入理解Netty中的消息异步通信机制和TCP通信的封装。 首先,Netty的核心是它的异步模型...
- **定义与特点**:Netty是一个基于Java NIO(Non-blocking IO)的网络应用框架,它旨在简化网络编程并提供高性能的网络应用解决方案。对于Java网络编程的新手而言,Netty是一个极佳的入门框架;而对于有经验的...
**Netty入门** 在“Netty02-入门.md”中,可能会涵盖Netty的基本概念和安装步骤。Netty的入门通常包括了解其基本组件,如Bootstrap(启动引导类)、ServerBootstrap(服务器启动引导类)、Channel(通道)、Event...
- **定义与特点**:Netty是一个基于NIO(Non-blocking IO)技术的客户端-服务器框架,旨在简化网络应用的开发过程,尤其适合于开发高性能的服务器端应用程序。Netty提供了简单而强大的API,使得开发人员能够更加专注...
Netty 是由 JBOSS 提供的一个java开源框架, 是业界最流行的NIO框 架,整合了多种协议 包括FTP、SMTP、HTTP等各种二进制文本协议)的实现经验,精 心设计的框架,在多个大型商业项目中得到充分验证。
本文档主要讲述了Netty5.0架构剖析和源码解读,涵盖了Netty的架构、源码分析、NIO入门等方面的知识点。 概述 JAVA 的 IO 演进是一个长期的过程,从传统的 BIO 通信到 NIO 的出现,都是为了解决通信中的问题。传统...
接下来,"netty入门"章节将引导读者逐步熟悉Netty的基本架构和组件,如Bootstrap、Channel、Handler、Pipeline等。Bootstrap是启动服务器或客户端的入口,Channel是连接的抽象,Handler处理网络事件,Pipeline是事件...
- **异步非阻塞I/O**:Netty基于NIO实现,支持异步非阻塞模式,有效提升资源利用率和并发能力。 #### 五、实战案例分析 - **HTTP服务器开发**:从零开始构建一个简单的HTTP服务器,理解HTTP请求响应过程。 - **...
Netty中的NIO实现主要基于java.nio包,NIO服务端和客户端的创建与传统IO模型有很大的不同。NIO服务端会监听端口,接受新的连接,并处理数据的读写操作。NIO客户端通过Bootstrap类初始化,并通过它发起连接请求。 **...
业界主流的NIO框架介绍10 2.NIO入门10 2.1. NIO服务端10 2.2. NIO客户端13 3.Netty源码分析16 3.1. 服务端创建16 3.1.1. 服务端启动辅助类ServerBootstrap16 3.1.2. NioServerSocketChannel 的注册21 3.1.3. 新的...
- **异步非阻塞I/O**:通过利用NIO(New IO),Netty实现了高效的非阻塞I/O操作。 - **事件驱动模型**:基于事件驱动的设计模式,使得开发者可以更加灵活地处理网络事件。 - **高度可配置性**:提供了丰富的API来...