多人Java 2D平台游戏:ObjectInputStream.readObject()停止程序?

多人Java 2D平台游戏:ObjectInputStream.readObject()停止程序?,java,multiplayer,objectinputstream,Java,Multiplayer,Objectinputstream,为了上学,我和我的朋友正在用java制作一个2D平台游戏。游戏本身运行良好,但我们在多人游戏部分遇到了一些问题 我们的游戏很简单,只是一个小家伙和一些敌人 我从来没有用java编程过两台电脑之间的连接,所以我的“连接”代码基于youtube上一些关于聊天应用程序的教程。连接工作正常,但问题是程序只从套接字读取输入,但不再运行游戏 我通过将它从while(true)循环中取出,成功地解决了这个问题,但现在我又遇到了另一个无法立即解决的问题 启动多人游戏时,您可以选择是创建游戏(服务器)还是加入游戏

为了上学,我和我的朋友正在用java制作一个2D平台游戏。游戏本身运行良好,但我们在多人游戏部分遇到了一些问题

我们的游戏很简单,只是一个小家伙和一些敌人

我从来没有用java编程过两台电脑之间的连接,所以我的“连接”代码基于youtube上一些关于聊天应用程序的教程。连接工作正常,但问题是程序只从套接字读取输入,但不再运行游戏

我通过将它从
while(true)
循环中取出,成功地解决了这个问题,但现在我又遇到了另一个无法立即解决的问题

启动多人游戏时,您可以选择是创建游戏(服务器)还是加入游戏(客户端)

创建游戏时,它将等待连接(客户端)连接后再开始。但现在,当整个游戏应该开始的时候,它“卡住了”。实际上,它并不是真的卡住了。假设您是服务器,您的朋友作为客户机连接到您的服务器。他加入你的游戏,在两台电脑上游戏开始,但你留在菜单上。只有当你的朋友(客户)点击一个按钮时,你屏幕(服务器)上的游戏才会移动(每次你的朋友点击一个按钮,游戏就会移动一点),如果你点击一个按钮,你的朋友游戏就会移动。如果服务器和客户端都将手指放在按钮上(左、右、跳转、开火…),游戏就可以完美地运行,但这当然不好

我认为问题在于这一行代码:

if(ServerState.server == true){
        try {                   
            Server.clientMessage = (String) Server.serverInput.readObject();
            System.out.println(Server.clientMessage);   
        }   
        catch (ClassNotFoundException e) {
            System.out.println("Data type not found");
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    if(ClientState.client == true){
        try {               
            Client.serverMessage = (String) Client.clientInput.readObject();
            System.out.println(Client.serverMessage);
        }
        catch(ClassNotFoundException e){
            System.out.println("Data type not found");
            e.printStackTrace();
        } 
        catch (IOException e) {
            e.printStackTrace();
        }
    }
serverInput
clientInput
都是
ObjectInputStreams

变量
serverState.server
ClientState.client
只是
boolean
来查看您是服务器还是客户端

此代码在“在线级别”的代码中实现

如果我只是对这段代码进行注释,游戏会运行,但“connectedPlayer”不会移动(服务器/客户端不会从客户端/服务器获取任何信息)

我的问题是:这行代码是否:

Server.clientMessage=(String)Server.serverInput.readObject()

等待输入,当他得到该程序可以继续?如果没有输入,整个程序就会停止? 如果我的解释足够清楚的话,有什么解决这个问题的办法吗

提前谢谢你


PS:抱歉我的英语不好:s

readObject
阻塞直到输入可用,然后在输入到达时返回。您需要创建一个新线程来读取输入,并将输入提供给游戏的其他部分


要将信息传递给游戏,您可能需要在
服务器
客户端
类中创建不同的方法来处理不同的消息。您可以使用
开关
if-else if
根据对象中的字段或对象的类型(使用
instanceof
)来决定使用哪种方法。

学校我指的是大学,不知道这是否会改变什么?但我不认为为任何类型的游戏编程对学生来说都太难,证据是游戏是有效的,我只是在多人游戏部分遇到了一些问题,因为我在该部分没有经验。尝试使用KryoNet而不是这种序列化。好的,谢谢你,如果有一件事我应该作为建议注意的话,我会看一看:如果你从某处复制粘贴代码,请确保它工作,更重要的是,如果你想在代码中使用它,请确保你理解它的作用。有时候,理解库的内部工作是不必要的,你只需要知道如何使用它-但你必须知道你的代码在做什么,如果它出了问题,你还必须知道如何调试发生错误的确切行,并据此找出错误所在。我实现了Runnable并启动了一个线程,程序现在用run()方法读取流,一切正常!多谢各位@Allinone51如果一个答案对你有效,那么接受它(通过点击复选标记)会向每个人显示该解决方案有效,并给我们双方带来一点声誉。不过你没有义务这么做。