转:
Java NIO中的 ServerSocketChannel 是一个可以监听新进来的TCP连接的通道, 就像标准IO中的ServerSocket一样。ServerSocketChannel类在 java.nio.channels包中。
这里有个例子:
01 |
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); |
03 |
serverSocketChannel.socket().bind( new InetSocketAddress( 9999 ));
|
06 |
SocketChannel socketChannel =
|
07 |
serverSocketChannel.accept();
|
打开 ServerSocketChannel
通过调用 ServerSocketChannel.open() 方法来打开ServerSocketChannel.如:
1 |
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); |
关闭 ServerSocketChannel
通过调用ServerSocketChannel.close() 方法来关闭ServerSocketChannel. 如:
1 |
serverSocketChannel.close(); |
监听新进来的连接
通过 ServerSocketChannel.accept() 方法监听新进来的连接。当 accept()方法返回的时候,它返回一个包含新进来的连接的 SocketChannel。因此, accept()方法会一直阻塞到有新连接到达。
通常不会仅仅只监听一个连接,在while循环中调用 accept()方法. 如下面的例子:
2 |
SocketChannel socketChannel =
|
3 |
serverSocketChannel.accept();
|
当然,也可以在while循环中使用除了true以外的其它退出准则。
非阻塞模式
ServerSocketChannel可以设置成非阻塞模式。在非阻塞模式下,accept() 方法会立刻返回,如果还没有新进来的连接,返回的将是null。 因此,需要检查返回的SocketChannel是否是null.如:
01 |
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); |
03 |
serverSocketChannel.socket().bind( new InetSocketAddress( 9999 ));
|
04 |
serverSocketChannel.configureBlocking( false );
|
07 |
SocketChannel socketChannel =
|
08 |
serverSocketChannel.accept();
|
10 |
if (socketChannel != null ){
|
分享到:
相关推荐
本文将深入探讨Netty中的几个关键组件,包括`NioServerSocketChannel`、`NioSocketChannel`、`NioEventLoop`、`NioEventLoopGroup`以及`Unsafe`系列类,并通过类关系图来解析它们的作用和相互关系。 1. **Nio...
创建一个`NioServerSocketChannel`的工厂类,实现`ServerBootstrap`的`childHandler`方法,设置`ChannelInitializer`,在这个初始化器中,我们可以添加`MessageDecoder`和`MessageEncoder`来处理入站和出站的数据。...
.channel(NioServerSocketChannel.class) // 选择NioServerSocketChannel作为服务器通道 .childHandler(new ChannelInitializer() { // 创建ChannelInitializer来设置每个新连接的管道 @Override protected void...
通过`ServerBootstrap`设置Channel类型为`NioServerSocketChannel`后,Netty会自动创建并配置这个Channel,将其绑定到指定的端口。 ```java // ServerBootstrap中设置Channel类型 b.channel(NioServerSocketChannel...
在服务器端,首先会创建一个ServerBootstrap,然后设置通道工厂,通常使用NioServerSocketChannel。接着,配置管道(Pipeline),这是一个处理入站和出站事件的链式结构,每个事件都会由对应的处理器(Handler)处理...
`ServerBootstrap` 是Netty框架的一部分,但其概念和使用方法同样适用于Java标准库中的`NioServerSocketChannel`。`ServerBootstrap` 提供了一种配置服务器和处理连接的灵活方式,它允许我们定义管道工厂、事件循环...
.channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer() { @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new MyBusinessHandler...
首先,Netty 使用 NioServerSocketChannel 作为服务器端的通道,它继承自 Java NIO 的 ServerSocketChannel,用于监听和接受来自客户端的连接请求。当客户端发起连接时,NioServerSocketChannel 会触发一个 Accept ...
5. **NioServerSocketChannel**:在Netty中,ServerChannel的具体实现之一是`NioServerSocketChannel`,它使用Java NIO(非阻塞I/O)来处理连接。NioServerSocketChannel监听指定的端口,并在有新的连接请求时创建新...
NioServerSocketChannel server = NioServerSocketChannel.open(); server.bind(new InetSocketAddress("localhost", 4444)); while (true) { SocketChannel client = server.accept(); // 处理客户端连接... } `...
.channel(NioServerSocketChannel.class) // 选择NioServerSocketChannel作为服务器通道 .handler(new ChannelInitializer() { // 设置初始化处理器 @Override protected void initChannel(SocketChannel ch) ...
(3), 在这里,我们指定使用NioServerSocketChannel类,该类用于实例化新的Channel以接受传入的连接。 (4),保持长连接 (5), childHandler()方法需要一个ChannelInitializer类,ChannelInitializer是一个特殊的处理...
Channel 对象用于读写数据,例如NioServerSocketChannel 和 NioSocketChannel 分别对应TCP服务端和客户端。 2. **EventLoop** - EventLoop 是Netty的事件循环器,负责处理I/O事件并调度处理器。Netty 使用多线程...
这里的`NioServerSocketChannel`是Netty提供的用于监听客户端连接的服务器套接字通道,`MyBusinessHandler`是我们自定义的业务处理器,它会处理每个新建立的连接。 在`MyBusinessHandler`中,我们可以实现对客户端...
`NioServerSocketChannel`用于监听和接受新的客户端连接,而`NioSocketChannel`代表与每个客户端建立的连接。在创建了这些通道后,你需要定义`ChannelHandler`来处理接收到的数据和发送出去的数据。`...
- **`.channel(NioServerSocketChannel.class)`**:指定使用`NioServerSocketChannel`作为服务器通道类型。 - **`.childHandler()`**:设置`ChannelInitializer`实例,用于初始化每个客户端连接的`ChannelPipeline`...
.channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer() { @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new ChatServerHandler...
服务器端需要指定使用的是哪种Channel(通道),在此例中使用的是`NioServerSocketChannel`,表示基于NIO的服务器端TCP Channel。通过`setPipelineFactory`方法设置消息处理的ChannelHandler,这是一个非常重要的...
Netty5中,AIO模型主要由NioEventLoop和NioServerSocketChannel实现。NioEventLoop是事件循环,负责处理I/O事件和执行用户任务;NioServerSocketChannel是服务器端的通道,用于监听新的连接。 3. **Channel和...