如何检测Netty 4.0.x的新传入连接? 这是一个简单服务器的代码:
public static void main(String[] args) {
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
System.out.println("Init channel");
ch.pipeline().addLast(new ChannelInboundHandlerAdapter() {
@Override
public void channelRegistered(ChannelHandlerContext ctx) {
System.out.println("Channel registered");
}
@Override
public void channelActive(final ChannelHandlerContext ctx) {
System.out.println("Channel active");
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
System.out.println("Channel read");
ctx.writeAndFlush((ByteBuf) msg);
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
System.out.println("Channel exception caught");
cause.printStackTrace();
ctx.close();
}
});
}
})
.option(ChannelOption.SO_BACKLOG, 128)
.childOption(ChannelOption.SO_KEEPALIVE, true);
ChannelFuture f;
try {
f = b.bind("127.0.0.1", 8080).sync();
f.channel().closeFuture().sync();
} catch (InterruptedException e) {
e.printStackTrace();
}
} finally {
workerGroup.shutdownGracefully();
bossGroup.shutdownGracefully();
}
}
问题是我无法检测建立连接的时刻。仅在客户端向服务器发送一些信息后才会调用所有 System.out.printlns 。这意味着在客户端将一些数据发送到服务器之前,服务器无法向客户端发送任何数据。
我的期望:
我得到了什么:
有没有办法实现这种行为?
答案 0 :(得分:0)
您可以在客户端连接到服务器时发送一些数据,因此您可以在channelRegistered或channelActive方法中使用ctx.writeAndFlush(msg)。 如果您的客户端没有收到任何数据,您应该确保编码的类型是正确的。
答案 1 :(得分:-1)
看起来端口号8080导致了这个问题。当我将端口号更改为12345时,程序开始按预期工作。