Java服务器正在等待客户端响应

时间:2015-01-04 20:33:45

标签: java networking network-programming server multiplayer

我已经进入游戏开发一段时间了,我试图让我的下一个游戏成为多人游戏。我试图编写一个服务器,每隔1/16秒左右循环一次,以计算游戏中所有实体等的位置。然后,客户端将能够在需要时请求所有这些信息。

因此,我尝试编写一个可以交换信息的简单服务器/客户端。部分代码可以在这里看到:

ServerSocket listener;
Socket socket;

while(running)
{
    socket = listener.accept();

    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
    out.println("information"); //sending the string "information" to any client that has connected
}

唯一的问题是服务器每次调用listener.accept()时都会等待客户端连接,因此会停止需要完成的循环中的所有其他操作。我怎样才能让许多客户端连接/请求信息而服务器不会停止每次专门监听它们?当涉及到所有这些网络内容时,我真的没有太多线索,这就是我试图学习的原因。我从来没有深入研究它,所以如果它是一个看似简单的解决方案,我会道歉。

(希望我对游戏如何在这里工作有正确的想法?我认为位置和一切都是服务器端,而客户端处理的唯一事情是渲染和用户输入等。 )

2 个答案:

答案 0 :(得分:3)

如果它是一个简单的解决方案,您应该考虑简单地线程处理请求,因此每个侦听器都与主程序代码分开运行:http://tutorials.jenkov.com/java-multithreaded-servers/multithreaded-server.html

此外,如果游戏涉及精确的动作,例如射击时,你应该考虑稍微快一点的滴答。

答案 1 :(得分:1)

您需要切换到 NIO ,这会提供非阻止功能:

class Server {
    public static void main(String[] args) {
        try {
            ServerSocketChannel serverSocket = ServerSocketChannel.open();
            serverSocket.configureBlocking(false);
            serverSocket.bind(port);

            while(running) {
                SocketChannel channel = serverSocket.accept();

                //...
            }
        }
    }
}

调用serverSocket.accept()时,如果没有接受连接,则会返回null,而不是阻止。

您还可以使用Selector来管理单个线程上的读/写和接受。请记住,每个用户都需要一个线程来阻止阅读。相反,Selector会通知您何时需要从任何频道进行阅读。