netty客户端

时间:2016-12-01 12:26:40

标签: java input netty system.in

我实际上正在使用Netty编写一个客户端 - 服务器程序,但我遇到了一个自上周以来无法解决的问题。

由于它是一个非常大的程序,我无法粘贴所有代码但是,我开始在Netty的github(https://github.com/netty/netty/tree/4.1/example/src/main/java/io/netty/example/securechat)中使用此示例

在游戏的背景下,我想允许玩家输入他喜欢的每个命令(改变他的名字,或者看看发生了什么),但事情是,在输入过程中,我无法收到服务器的答案。

通过回调接收服务器答案:

public class ClientHandler extends SimpleChannelInboundHandler<String> {

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        System.out.println(cause.getMessage());
        ctx.close();
        System.exit(84);
    }

    @Override
    public void channelRead0(ChannelHandlerContext arg0, String answer) throws Exception {
       // HERE
    }
}

在我的主循环中,我实际上正在这样做(我简化它因为它太长了):

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String line;
line = in.readLine();
// Process and send to server
System.out.println(line);

当我在等待用户的输入并同时接收服务器应答时,输入阻止了我的回调。我只在输入完成时收到它。

有人可以开导我吗?我怎样才能进行非阻塞输入,或者当服务器实际发送给我什么时,我可以停止输入过程并阅读答案?

谢谢!

1 个答案:

答案 0 :(得分:1)

您应该将输入循环与netty处理程序分离。

如果从netty处理程序启动游戏输入循环,则意味着netty线程永远不会将其返回到netty的核心,因此您的频道被标记为忙,这意味着新输入将排队,并且只有在线程返回时才会被处理。

解决这个问题的一个好方法是在程序启动时创建一个新的线程实例,并使该线程调用netty的方法来执行游戏操作。