这是我第一次使用Netty,我设法让我的服务器和客户端一起工作。
现在我想在其上添加安全性,服务器正在等待传入的客户端 并且在接受之后,服务器将在几秒钟内发送消息和期望响应。 然后,如果客户端没有响应,则服务器将自动断开连接。怎么做?
EventLoopGroup bossGroup = new NioEventLoopGroup(); // (1)
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap b = new ServerBootstrap(); // (2)
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class) // (3)
.childHandler(new ChannelInitializer<SocketChannel>() { // (4)
@Override
public void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new ServerHandler());
}
}).option(ChannelOption.SO_BACKLOG, 128) // (5)
.childOption(ChannelOption.SO_KEEPALIVE, true); // (6)
// Bind and start to accept incoming connections.
Log.w(TAG,"SERVER started, waiting for incoming clients...");
ChannelFuture f = b.bind(port).sync(); // (7)
//Immediately send message to the client, but this failed
Channel channel = f.awaitUninterruptibly().channel();
channel.writeAndFlush("passsword?\n");
/** Expect response from client here... but how??? **/
f.channel().closeFuture().sync();
} catch (Exception e){
Log.e(TAG,"SERVER Exception, >> " + e.toString());
}finally {
workerGroup.shutdownGracefully();
bossGroup.shutdownGracefully();
Log.w(TAG,"SERVER finally Stopped.");
}
我甚至尝试在接受客户后使用channel.writeAndFlush("passsword?\n");
发送消息,但客户端没有收到任何消息。
有什么想法吗?
答案 0 :(得分:0)
我认为你的绑定操作返回的通道不是客户端通道是错误的,它是管理客户端通道的服务器通道(接受新的连接等)。
如果要在客户端连接后发送数据包,则需要在其中一个客户端处理程序中使用channelActive方法发送数据包。 (在您的示例中,它是ServerHandler)
这是一个例子:
public class FooHandler extends SimpleChannelInboundHandler<Bar> {
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
super.channelActive(ctx);
ctx.channel().writeAndFlush("HELLO:PASSWORD");
}
@Override
protected void channelRead0(ChannelHandlerContext ctx, Bar bar) throws Exception {
//do stuff
}
}
希望有所帮助