在 Netty ServerSocket 中获取主线程
Getting the main thread back in Netty ServerSocket
我有一个关于在创建 TCP 服务器套接字时如何在 Netty 中恢复主线程的问题。
在下面摘自 here 的代码中,"Hello Hello" 永远不会写在输出中,因为启动服务器的线程在这一行等待:f.channel().closeFuture().sync();
。在这种情况下,我是否需要创建一个单独的线程来恢复主线程,或者 Netty 中是否有任何方法允许我这样做(在后台拥有 TCP 运行 的同时恢复主线程) ?
public void start() throws Exception {
NioEventLoopGroup group = new NioEventLoopGroup();
try {
ServerBootstrap b = new ServerBootstrap();
b.group(group)
.channel(NioServerSocketChannel.class)
.localAddress(new InetSocketAddress(port))
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch)
throws Exception {
ch.pipeline().addLast(
new EchoServerHandler());
}
});
ChannelFuture f = b.bind().sync();
System.out.println(EchoServer.class.getName() + " started and listen on " + f.channel().localAddress());
f.channel().closeFuture().sync();
} finally {
group.shutdownGracefully().sync();
}
}
public static void main(String[] args) throws Exception {
if (args.length != 1) {
System.err.println(
"Usage: " + EchoServer.class.getSimpleName() +
" <port>");
return;
}
int port = Integer.parseInt(args[0]);
new EchoServer(port).start();
System.out.println("Hello Hello");
}
您无需等待收盘日。这仅在教程中完成,以使事件循环组正确关闭。
您可以从程序中删除 f.channel().closeFuture().sync();
和 group.shutdownGracefully().sync();
行,使其成为非阻塞的。
确保在关闭主程序时调用 f.channel().close()
,然后调用 f.channel().closeFuture().sync()
,最后调用 group.shutdownGracefully().sync();
,以确保正确停止 Netty 堆栈
我有一个关于在创建 TCP 服务器套接字时如何在 Netty 中恢复主线程的问题。
在下面摘自 here 的代码中,"Hello Hello" 永远不会写在输出中,因为启动服务器的线程在这一行等待:f.channel().closeFuture().sync();
。在这种情况下,我是否需要创建一个单独的线程来恢复主线程,或者 Netty 中是否有任何方法允许我这样做(在后台拥有 TCP 运行 的同时恢复主线程) ?
public void start() throws Exception {
NioEventLoopGroup group = new NioEventLoopGroup();
try {
ServerBootstrap b = new ServerBootstrap();
b.group(group)
.channel(NioServerSocketChannel.class)
.localAddress(new InetSocketAddress(port))
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch)
throws Exception {
ch.pipeline().addLast(
new EchoServerHandler());
}
});
ChannelFuture f = b.bind().sync();
System.out.println(EchoServer.class.getName() + " started and listen on " + f.channel().localAddress());
f.channel().closeFuture().sync();
} finally {
group.shutdownGracefully().sync();
}
}
public static void main(String[] args) throws Exception {
if (args.length != 1) {
System.err.println(
"Usage: " + EchoServer.class.getSimpleName() +
" <port>");
return;
}
int port = Integer.parseInt(args[0]);
new EchoServer(port).start();
System.out.println("Hello Hello");
}
您无需等待收盘日。这仅在教程中完成,以使事件循环组正确关闭。
您可以从程序中删除 f.channel().closeFuture().sync();
和 group.shutdownGracefully().sync();
行,使其成为非阻塞的。
确保在关闭主程序时调用 f.channel().close()
,然后调用 f.channel().closeFuture().sync()
,最后调用 group.shutdownGracefully().sync();
,以确保正确停止 Netty 堆栈