2016-12-01 115 views
0

实际上我使用Netty编写客户端 - 服务器程序,但是我陷入了自上周以来无法解决的问题。netty客户端上的Java输入

因为这是一个非常大的项目,我不能粘贴我所有的代码,但是,我开始使用从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

我有点困惑。在用户输入之前,您会收到来自服务器的答案? –

+0

实际上,当我在做“line = in.readLine()”时,我很可能会收到服务器的回答,但我无法得到它。例如:有5名玩家。播放器5正在播放,我正在键入要发送到服务器的内容。当玩家轮到他时,游戏(无论什么原因)结束了:所以游戏应该从头开始并通知所有玩家。但是,由于玩家1,2,3和我卡在readLine()过程中,我们无法获得服务器的通知(回调不被调用,但通常应该)。只有当我们通过readLine部分时,我们才会得到它。 – NPanda

+0

http://stackoverflow.com/questions/40668791/how-can-a-netty-server-cancel-receiving-a-response-from-a-web-server这可能会帮助你。 –

回答

1

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

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

解决这个问题的一个好方法就是让一个新的线程实例正确的启动你的程序,并且让这个线程调用netty的方法去做你的游戏动作。