如何使用基本Java套接字停止(“跳过”)等待服务器响应的客户端

如何使用基本Java套接字停止(“跳过”)等待服务器响应的客户端,java,swing,sockets,concurrency,timer,Java,Swing,Sockets,Concurrency,Timer,我在让我的简单多人游戏正常运行方面遇到了一个小问题,这在很大程度上与客户端无限期地等待服务器的响应有关。游戏主要是实时的,这就是为什么会出现这个问题。在项目中将其更改为基于回合的解决方案(这将是我的最后手段)有点晚了。我使用定时器来处理游戏的实时方面。在单人游戏中,每件事都能完美地工作,所以这只是一个阻碍我前进的问题。基本上,计时器会在更新所有常规游戏逻辑更新之前检查来自服务器的任何消息。这是在handleServerResponses()函数中完成的。以下是计时器的代码: timer.addA

我在让我的简单多人游戏正常运行方面遇到了一个小问题,这在很大程度上与客户端无限期地等待服务器的响应有关。游戏主要是实时的,这就是为什么会出现这个问题。在项目中将其更改为基于回合的解决方案(这将是我的最后手段)有点晚了。我使用定时器来处理游戏的实时方面。在单人游戏中,每件事都能完美地工作,所以这只是一个阻碍我前进的问题。基本上,计时器会在更新所有常规游戏逻辑更新之前检查来自服务器的任何消息。这是在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");
            }

        }

    });
timer.addActionListener(新ActionListener(){
@凌驾
已执行公共无效操作(操作事件arg0){
如果(!gamePanel.getGameOver()){
handleServerResponses();
gamePanel.updateZombieAI();

如果(Math.floor(Math.random()*100)这里有两个解决方案:正确的和(可能)简单的解决方案

正确的解决方案是按照Hovercarft中的EEL进行注释,并有一个单独的线程处理您的网络数据。在此模型中,您的响应处理程序将读取数据并将其添加到队列中,而您的游戏线程将在队列可用时从队列中读取数据。在此模型中,您的游戏线程从不等待n网络数据,因为它是IO线程的域

如果由于某种原因,该解决方案令您望而生畏或不可能实现,那么快速修复方法可能是在尝试读取它之前简单地调用
inStream.ready()
。这绝不能保证,因为调用
ready()
不能确保可以读取整行内容,但如果您的服务器只响应整行内容,则可能足以解除您的阻止


为了记录在案,我强烈推荐第一个使用独立IO线程的解决方案,该线程与游戏线程不耦合,因为它将更加健壮。

如果游戏逻辑应该基于回合,那么我会这样做。但不管怎样,在将Swing GUI与套接字I/O混合使用时,您必须考虑线程问题,主要是您必须注意I/O代码不会占用Swing事件线程(EDT)。这对于输出部分来说并不是什么大问题,但它与输入部分非常相关,出于这个原因,必须在后台线程中处理InputStream。非常感谢!我将试一试。回答很好——感谢您教育我们所有人。1+非常感谢您和气垫船!我将尝试这两种解决方案。
public void handleServerResponses(){        
    try {
        String message=inStream.readLine();<---Here is where it gets stuck