【问题标题】:Java input on netty client sideNetty 客户端的 Java 输入
【发布时间】: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


【解决方案1】:

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

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

解决此问题的一个好方法是在程序开始时创建一个新线程实例,并让该线程调用 netty 的方法来执行您的游戏操作。

【讨论】:

    猜你喜欢
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    • 2012-05-30
    • 2011-07-04
    • 1970-01-01
    相关资源
    最近更新 更多