`

NIO 的ServerSocketChannel

    博客分类:
  • NIO
 
阅读更多

转:

Java NIO中的 ServerSocketChannel 是一个可以监听新进来的TCP连接的通道, 就像标准IO中的ServerSocket一样。ServerSocketChannel类在 java.nio.channels包中。


这里有个例子:

01 ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
02  
03 serverSocketChannel.socket().bind(new InetSocketAddress(9999));
04  
05 while(true){
06     SocketChannel socketChannel =
07             serverSocketChannel.accept();
08  
09     //do something with socketChannel...
10 }

打开 ServerSocketChannel

通过调用 ServerSocketChannel.open() 方法来打开ServerSocketChannel.如:

1 ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

关闭 ServerSocketChannel

通过调用ServerSocketChannel.close() 方法来关闭ServerSocketChannel. 如:

1 serverSocketChannel.close();

监听新进来的连接

通过 ServerSocketChannel.accept() 方法监听新进来的连接。当 accept()方法返回的时候,它返回一个包含新进来的连接的 SocketChannel。因此, accept()方法会一直阻塞到有新连接到达。

通常不会仅仅只监听一个连接,在while循环中调用 accept()方法. 如下面的例子:

1 while(true){
2     SocketChannel socketChannel =
3             serverSocketChannel.accept();
4  
5     //do something with socketChannel...
6 }

当然,也可以在while循环中使用除了true以外的其它退出准则。

非阻塞模式

ServerSocketChannel可以设置成非阻塞模式。在非阻塞模式下,accept() 方法会立刻返回,如果还没有新进来的连接,返回的将是null。 因此,需要检查返回的SocketChannel是否是null.如:

01 ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
02  
03 serverSocketChannel.socket().bind(new InetSocketAddress(9999));
04 serverSocketChannel.configureBlocking(false);
05  
06 while(true){
07     SocketChannel socketChannel =
08             serverSocketChannel.accept();
09  
10     if(socketChannel != null){
11         //do something with socketChannel...
12     }
13 }
分享到:
评论

相关推荐

    笔记,4、深入Netty1

    本文将深入探讨Netty中的几个关键组件,包括`NioServerSocketChannel`、`NioSocketChannel`、`NioEventLoop`、`NioEventLoopGroup`以及`Unsafe`系列类,并通过类关系图来解析它们的作用和相互关系。 1. **Nio...

    nio socket 消息推送

    创建一个`NioServerSocketChannel`的工厂类,实现`ServerBootstrap`的`childHandler`方法,设置`ChannelInitializer`,在这个初始化器中,我们可以添加`MessageDecoder`和`MessageEncoder`来处理入站和出站的数据。...

    java nio&netty系列之三netty网络模型代码以及简化版代码示例

    .channel(NioServerSocketChannel.class) // 选择NioServerSocketChannel作为服务器通道 .childHandler(new ChannelInitializer() { // 创建ChannelInitializer来设置每个新连接的管道 @Override protected void...

    Netty5.0架构剖析和源码解读

    通过`ServerBootstrap`设置Channel类型为`NioServerSocketChannel`后,Netty会自动创建并配置这个Channel,将其绑定到指定的端口。 ```java // ServerBootstrap中设置Channel类型 b.channel(NioServerSocketChannel...

    一个NIO服务端,客户端的例子

    在服务器端,首先会创建一个ServerBootstrap,然后设置通道工厂,通常使用NioServerSocketChannel。接着,配置管道(Pipeline),这是一个处理入站和出站事件的链式结构,每个事件都会由对应的处理器(Handler)处理...

    ServerBootstrap实现nio.rar_NIO_ServerBootstrap_heart8w9_java nio

    `ServerBootstrap` 是Netty框架的一部分,但其概念和使用方法同样适用于Java标准库中的`NioServerSocketChannel`。`ServerBootstrap` 提供了一种配置服务器和处理连接的灵活方式,它允许我们定义管道工厂、事件循环...

    Mina NIO Socket

    .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer() { @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new MyBusinessHandler...

    抓到 Netty 一个 Bug,顺带来透彻地聊一下 Netty 是如何高效接收网络连接的.doc

    首先,Netty 使用 NioServerSocketChannel 作为服务器端的通道,它继承自 Java NIO 的 ServerSocketChannel,用于监听和接受来自客户端的连接请求。当客户端发起连接时,NioServerSocketChannel 会触发一个 Accept ...

    netty学习之ServerChannel

    5. **NioServerSocketChannel**:在Netty中,ServerChannel的具体实现之一是`NioServerSocketChannel`,它使用Java NIO(非阻塞I/O)来处理连接。NioServerSocketChannel监听指定的端口,并在有新的连接请求时创建新...

    libgdx net的使用

    NioServerSocketChannel server = NioServerSocketChannel.open(); server.bind(new InetSocketAddress("localhost", 4444)); while (true) { SocketChannel client = server.accept(); // 处理客户端连接... } `...

    Netty4详解二:开发第一个Netty应用程序

    .channel(NioServerSocketChannel.class) // 选择NioServerSocketChannel作为服务器通道 .handler(new ChannelInitializer() { // 设置初始化处理器 @Override protected void initChannel(SocketChannel ch) ...

    基于springboot+netty实现的心跳检测源码+项目说明文档.zip

    (3), 在这里,我们指定使用NioServerSocketChannel类,该类用于实例化新的Channel以接受传入的连接。 (4),保持长连接 (5), childHandler()方法需要一个ChannelInitializer类,ChannelInitializer是一个特殊的处理...

    Netty主要使用类讲解.docx

    Channel 对象用于读写数据,例如NioServerSocketChannel 和 NioSocketChannel 分别对应TCP服务端和客户端。 2. **EventLoop** - EventLoop 是Netty的事件循环器,负责处理I/O事件并调度处理器。Netty 使用多线程...

    基于netty编写的socket服务端

    这里的`NioServerSocketChannel`是Netty提供的用于监听客户端连接的服务器套接字通道,`MyBusinessHandler`是我们自定义的业务处理器,它会处理每个新建立的连接。 在`MyBusinessHandler`中,我们可以实现对客户端...

    netty入门例子--(不是翻译官方文档)

    `NioServerSocketChannel`用于监听和接受新的客户端连接,而`NioSocketChannel`代表与每个客户端建立的连接。在创建了这些通道后,你需要定义`ChannelHandler`来处理接收到的数据和发送出去的数据。`...

    Netty源码解析-服务启动过程.pdf

    - **`.channel(NioServerSocketChannel.class)`**:指定使用`NioServerSocketChannel`作为服务器通道类型。 - **`.childHandler()`**:设置`ChannelInitializer`实例,用于初始化每个客户端连接的`ChannelPipeline`...

    用Netty实现NIO Socket聊天系统示例

    .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer() { @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new ChatServerHandler...

    Java_NIO框架Netty教程.pdf

    服务器端需要指定使用的是哪种Channel(通道),在此例中使用的是`NioServerSocketChannel`,表示基于NIO的服务器端TCP Channel。通过`setPipelineFactory`方法设置消息处理的ChannelHandler,这是一个非常重要的...

    Netty5 AIO

    Netty5中,AIO模型主要由NioEventLoop和NioServerSocketChannel实现。NioEventLoop是事件循环,负责处理I/O事件和执行用户任务;NioServerSocketChannel是服务器端的通道,用于监听新的连接。 3. **Channel和...

Global site tag (gtag.js) - Google Analytics