【发布时间】:2016-12-03 22:39:39
【问题描述】:
我实际上是在使用 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);
当我在等待用户输入并同时接收服务器应答时,输入阻塞了我的回调。我只有在输入完成后才会收到它。
有人可以启发我吗?我怎样才能继续进行非阻塞输入或其他什么,所以当服务器实际向我发送一些东西时,我可以停止输入过程并阅读答案?
谢谢!
【问题讨论】:
-
我有点困惑。在用户输入之前,您会收到来自服务器的答复?
-
其实,当我在做“line = in.readLine()”的时候,很可能会收到来自服务器的回复,但我无法得到。示例:有 5 名玩家。播放器 5 正在播放,我正在输入要发送到服务器的内容。当玩家完成他的回合时,游戏(无论出于何种原因)结束:所以游戏应该从头开始并通知所有玩家。但是由于我和玩家 1、2、3 卡在 readLine() 过程中,我们无法获得服务器的通知(回调没有被调用,但通常应该)。只有当我们通过 readLine 部分时,我们才会得到它。
-
stackoverflow.com/questions/40668791/… 这可能对你有帮助。
标签: java input netty system.in