专栏
天翼云开发者社区

Netty-NIO的网络应用框架

2024-02-21 17:30:31 9阅读

Netty的核心-NIO:

  Java NIO(New I/O,新 I/O)是 Java 1.4 引入的一组用于高性能 I/O 操作的 API,相比于传统的阻塞式 I/O(IO)来说,Java NIO 提供了一种非阻塞式的 I/O 操作方式。传统的 Java I/O 是基于流的,而 Java NIO 则是基于通道(Channel)和缓冲区(Buffer)的。

下面是 Java NIO 相对于传统 IO 的一些优势:

非阻塞 I/O:Java NIO 提供了非阻塞式的 I/O 操作方式,使得一个线程能够处理多个连接,而不需要为每个连接创建一个独立的线程。这种非阻塞的特性使得 Java NIO 在处理大量并发连接时表现更为出色。

选择器(Selector):Java NIO 中的选择器是一种用于多路复用的机制,它可以监控多个通道的事件,如接收数据、发送数据、连接就绪等,从而使得一个线程可以同时管理多个通道,提高了系统的效率。

内存缓冲区:Java NIO 使用了基于缓冲区的数据处理模式,数据从通道读取到缓冲区,然后再从缓冲区写入到通道。这种方式可以减少数据复制的次数,提高了数据的处理效率。

零拷贝:Java NIO 提供了一些零拷贝的技术,如直接缓冲区(Direct Buffer),它可以直接在 JVM 之外分配内存,避免了数据在 JVM 内存和操作系统内核空间之间的复制,从而提高了数据传输的效率。

多协议支持:Java NIO 支持多种网络协议,如 TCP、UDP、HTTP 等,可以灵活应对不同类型的网络通信需求。

Netty的本质-基于NIO的第三方依赖服务:

  Netty 是一个基于 Java NIO(Non-blocking I/O,非阻塞 I/O)的网络应用框架,它提供了一种相对简单、高效、稳定的方式来开发各种网络应用程序。Netty 的设计目标是提供一种高性能、可扩展性好、易于使用的网络编程框架,它在网络通信、高并发、高性能方面有着显著的优势。 以下是 Netty 的一些特点:

异步事件驱动:Netty 使用异步事件驱动的模型,所有的 I/O 操作都是异步的,这使得它能够处理大量的并发连接而不需要使用多线程来管理这些连接,从而提高了系统的吞吐量和并发能力。

基于 NIO 的实现:Netty 基于 Java NIO 实现,这意味着它使用了非阻塞的 I/O 操作,能够更高效地处理大量的连接。

高性能:Netty 的设计考虑了性能因素,它提供了一系列优化措施来保证高性能,例如零拷贝、内存池等。

可扩展性:Netty 的组件化设计使得它非常灵活,可以根据需要定制和扩展各种功能。

支持多种协议:Netty 广泛应用于各种网络协议的实现,包括 HTTP、WebSocket、TCP、UDP 等。

Netty的运用场景:

  Netty的异步非阻塞IO在网络通信方面有天然的优势,实际上Netty也主要运用于及时通讯系统,例如大家耳熟能详的聊天工具腾讯QQ也是基于Netty实现的,使用 Netty 作为通信框架使得 QQ 能够更高效地处理大量的用户连接和消息传输,保证了其稳定性和性能。Netty 在 QQ 中的应用具体体现在以下几个方面:

高并发处理:QQ 作为一个拥有数亿用户的即时通讯软件,需要处理大量的用户连接和消息传输,Netty 的异步事件驱动模型使得 QQ 能够高效地处理这些并发连接。

稳定性:Netty 提供了一种稳定可靠的网络通信方案,能够保证 QQ 在面对各种网络情况和负载情况下都能够正常运行。

多协议支持:QQ 使用 Netty 不仅仅局限于某一种协议,它可以灵活地支持多种协议,例如 TCP、UDP,甚至是 HTTP 和 WebSocket 等,这使得 QQ 能够适应不同场景下的通信需求。

Netty的简单使用:

  以下用java的代码简单实现客户端和服务端,方便大家快速理解Netty的使用方式:

  服务端:

1.启动和监听:

 
public class NettyServer {
public static void main(String[] args) throws Exception {
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new NettyServerHandler());
}
});
ChannelFuture future = bootstrap.bind(8080).sync();
future.channel().closeFuture().sync();
} finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
}
2.客户端
public class NettyClient {

public static void main(String[] args) throws Exception {
EventLoopGroup group = new NioEventLoopGroup();

try {
Bootstrap bootstrap = new Bootstrap();
bootstrap.group(group)
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new NettyClientHandler());
}
});

ChannelFuture future = bootstrap.connect("localhost", 8080).sync();
future.channel().closeFuture().sync();
} finally {
group.shutdownGracefully();
}
}
}
可以看到,IM的实现主要就是包括服务端和客户端之间的相互监听和消息收发时的处理器。服务端负责监听指定的端口,等待客户端的连接请求。当客户端连接上来
时,服务端需要为每个客户端连接创建一个对应的处理器(通常是一个线程或者协程),用于处理该客户端发送过来的消息,执行相应的业务逻辑,然后将处理结
果返回给客户端。客户端负责连接到服务端,并发送消息给服务端。客户端也会创建一个处理器,用于处理服务端返回的消息。客户端的处理器负责接收服务端发
送的消息,对这些消息进行处理,比如显示在用户界面上,或者触发相应的操作。
  • 0
  • 0
  • 0
0 评论
0/1000
评论(0) 发表评论
打****帝

打****帝

1 篇文章 0 粉丝
关注

Netty-NIO的网络应用框架

2024-02-21 17:30:31 9阅读

Netty的核心-NIO:

  Java NIO(New I/O,新 I/O)是 Java 1.4 引入的一组用于高性能 I/O 操作的 API,相比于传统的阻塞式 I/O(IO)来说,Java NIO 提供了一种非阻塞式的 I/O 操作方式。传统的 Java I/O 是基于流的,而 Java NIO 则是基于通道(Channel)和缓冲区(Buffer)的。

下面是 Java NIO 相对于传统 IO 的一些优势:

非阻塞 I/O:Java NIO 提供了非阻塞式的 I/O 操作方式,使得一个线程能够处理多个连接,而不需要为每个连接创建一个独立的线程。这种非阻塞的特性使得 Java NIO 在处理大量并发连接时表现更为出色。

选择器(Selector):Java NIO 中的选择器是一种用于多路复用的机制,它可以监控多个通道的事件,如接收数据、发送数据、连接就绪等,从而使得一个线程可以同时管理多个通道,提高了系统的效率。

内存缓冲区:Java NIO 使用了基于缓冲区的数据处理模式,数据从通道读取到缓冲区,然后再从缓冲区写入到通道。这种方式可以减少数据复制的次数,提高了数据的处理效率。

零拷贝:Java NIO 提供了一些零拷贝的技术,如直接缓冲区(Direct Buffer),它可以直接在 JVM 之外分配内存,避免了数据在 JVM 内存和操作系统内核空间之间的复制,从而提高了数据传输的效率。

多协议支持:Java NIO 支持多种网络协议,如 TCP、UDP、HTTP 等,可以灵活应对不同类型的网络通信需求。

Netty的本质-基于NIO的第三方依赖服务:

  Netty 是一个基于 Java NIO(Non-blocking I/O,非阻塞 I/O)的网络应用框架,它提供了一种相对简单、高效、稳定的方式来开发各种网络应用程序。Netty 的设计目标是提供一种高性能、可扩展性好、易于使用的网络编程框架,它在网络通信、高并发、高性能方面有着显著的优势。 以下是 Netty 的一些特点:

异步事件驱动:Netty 使用异步事件驱动的模型,所有的 I/O 操作都是异步的,这使得它能够处理大量的并发连接而不需要使用多线程来管理这些连接,从而提高了系统的吞吐量和并发能力。

基于 NIO 的实现:Netty 基于 Java NIO 实现,这意味着它使用了非阻塞的 I/O 操作,能够更高效地处理大量的连接。

高性能:Netty 的设计考虑了性能因素,它提供了一系列优化措施来保证高性能,例如零拷贝、内存池等。

可扩展性:Netty 的组件化设计使得它非常灵活,可以根据需要定制和扩展各种功能。

支持多种协议:Netty 广泛应用于各种网络协议的实现,包括 HTTP、WebSocket、TCP、UDP 等。

Netty的运用场景:

  Netty的异步非阻塞IO在网络通信方面有天然的优势,实际上Netty也主要运用于及时通讯系统,例如大家耳熟能详的聊天工具腾讯QQ也是基于Netty实现的,使用 Netty 作为通信框架使得 QQ 能够更高效地处理大量的用户连接和消息传输,保证了其稳定性和性能。Netty 在 QQ 中的应用具体体现在以下几个方面:

高并发处理:QQ 作为一个拥有数亿用户的即时通讯软件,需要处理大量的用户连接和消息传输,Netty 的异步事件驱动模型使得 QQ 能够高效地处理这些并发连接。

稳定性:Netty 提供了一种稳定可靠的网络通信方案,能够保证 QQ 在面对各种网络情况和负载情况下都能够正常运行。

多协议支持:QQ 使用 Netty 不仅仅局限于某一种协议,它可以灵活地支持多种协议,例如 TCP、UDP,甚至是 HTTP 和 WebSocket 等,这使得 QQ 能够适应不同场景下的通信需求。

Netty的简单使用:

  以下用java的代码简单实现客户端和服务端,方便大家快速理解Netty的使用方式:

  服务端:

1.启动和监听:

 
public class NettyServer {
public static void main(String[] args) throws Exception {
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new NettyServerHandler());
}
});
ChannelFuture future = bootstrap.bind(8080).sync();
future.channel().closeFuture().sync();
} finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
}
2.客户端
public class NettyClient {

public static void main(String[] args) throws Exception {
EventLoopGroup group = new NioEventLoopGroup();

try {
Bootstrap bootstrap = new Bootstrap();
bootstrap.group(group)
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new NettyClientHandler());
}
});

ChannelFuture future = bootstrap.connect("localhost", 8080).sync();
future.channel().closeFuture().sync();
} finally {
group.shutdownGracefully();
}
}
}
可以看到,IM的实现主要就是包括服务端和客户端之间的相互监听和消息收发时的处理器。服务端负责监听指定的端口,等待客户端的连接请求。当客户端连接上来
时,服务端需要为每个客户端连接创建一个对应的处理器(通常是一个线程或者协程),用于处理该客户端发送过来的消息,执行相应的业务逻辑,然后将处理结
果返回给客户端。客户端负责连接到服务端,并发送消息给服务端。客户端也会创建一个处理器,用于处理服务端返回的消息。客户端的处理器负责接收服务端发
送的消息,对这些消息进行处理,比如显示在用户界面上,或者触发相应的操作。
文章来自专栏

框架

1 篇文章 1 订阅
0 评论
0/1000
评论(0) 发表评论
  • 0
    点赞
  • 0
    收藏
  • 0
    评论