gpt4 book ai didi

java - 如何使用基本 Java 套接字停止 ("skip") 等待服务器响应的客户端

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:57:13 25 4
gpt4 key购买 nike

我在让我的简单多人游戏运行时遇到了一个小问题,这在很大程度上与客户端无限期地等待服务器响应有关。游戏主要是实时的,这就是出现此问题的原因。在项目中将其更改为基于回合制的解决方案有点晚了(这将是我最后的选择)。我正在使用计时器来处理游戏的实时方面。一切都在单人游戏中完美运行,所以从字面上看就是这个问题阻碍了我。基本上,计时器会在更新所有常规游戏逻辑更新之前检查来自服务器的任何消息。这是在 handleServerResponses() 函数中完成的。这是定时器的代码:

timer.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
if(!gamePanel.getGameOver()){
handleServerResponses();
gamePanel.updateZombieAI();
if(Math.floor(Math.random()*100)<(10+Math.ceil(gamePanel.getPlayer1Score()/10))){
gamePanel.spawnZombie();
}
}
else{
timer.stop();
sendMessage("TERMINATE");
}

}

});

这里是 handleServerResponses 方法的部分代码:

public void handleServerResponses(){        
try {
String message=inStream.readLine();<---Here is where it gets stuck

如您所见,程序在等待服务器发送响应时卡住了,但它永远不会发送响应,因为玩家都无法移动或发送消息。 inStream 变量只是一个使用服务器输入流的 BufferedReader。我只是在客户端和服务器之间传递文本。有什么办法可以跳过等待响应吗?意思是,如果没有从服务器发送任何东西,程序是否可以在那个计时器滴答声中忽略它并正常更新游戏逻辑?在过去的一个小时里,我一直在寻找答案,但一无所获。

谢谢!

最佳答案

这里有两种解决方案:正确的和(可能)简单的解决方案。

正确的解决方案是按照 Hovercarft Full Of Eels 的评论进行操作,并使用单独的线程处理您的网络数据。在这个模型中,你会让你的响应处理程序读取数据并将其添加到队列中,并且你的游戏线程在/如果可用时从这个队列中读取数据。在此模型中,您的游戏线程永远不会等待网络数据,因为这是 IO 线程的领域。

如果由于某种原因该解决方案让您望而却步或无法实现,那么快速解决方法可能是在尝试从中读取之前简单地调用 inStream.ready()。这绝不是一种保证,因为调用 ready() 并不能确保可以读取整行,但如果您的服务器只响应整行,那么它可能足以解除阻塞.

郑重声明,我强烈建议第一种解决方案使用与您的游戏线程分离的单独 IO 线程,因为它会更健壮。

关于java - 如何使用基本 Java 套接字停止 ("skip") 等待服务器响应的客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33223428/

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