gpt4 book ai didi

Netty客户端的Java输入

转载 作者:行者123 更新时间:2023-12-01 09:11:14 24 4
gpt4 key购买 nike

我实际上正在使用 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);

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

有人可以启发我吗?我怎样才能继续进行非阻塞输入或其他什么,以便当服务器实际向我发送某些内容时,我可以停止输入过程并读取答案?

谢谢!

最佳答案

您应该将输入循环与 netty 处理程序解耦。

如果你从 netty 处理程序启动你的游戏输入循环,这将意味着 netty 线程永远不会返回到 netty 的核心,因此你的 channel 被标记为繁忙,这意味着新的输入将排队,并且仅当线程返回时才会被处理。

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

关于Netty客户端的Java输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40910670/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com