我实际上正在使用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);
当我在等待用户的输入并同时接收服务器应答时,输入阻止了我的回调。我只在输入完成时收到它。
有人可以开导我吗?我怎样才能进行非阻塞输入,或者当服务器实际发送给我什么时,我可以停止输入过程并阅读答案?
谢谢!
答案 0 :(得分:1)
您应该将输入循环与netty处理程序分离。
如果从netty处理程序启动游戏输入循环,则意味着netty线程永远不会将其返回到netty的核心,因此您的频道被标记为忙,这意味着新输入将排队,并且只有在线程返回时才会被处理。
解决这个问题的一个好方法是在程序启动时创建一个新的线程实例,并使该线程调用netty的方法来执行游戏操作。