有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我从事游戏开发已经有一段时间了,我正在努力使我的下一个游戏成为多人游戏。我正在尝试编写一个服务器,它将每隔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
}

唯一的问题是服务器每次都会等待客户端连接。调用accept(),因此停止循环中需要执行的所有其他操作。我如何使许多客户机能够连接/请求信息,而不需要服务器每次都停下来专门监听它们?我真的没有太多的线索,当涉及到所有这些网络的东西,这就是为什么我试图学习。我从来没有深入研究过,所以如果这是一个看似简单的解决方案,我很抱歉

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


共 (2) 个答案

  1. # 2 楼答案

    您需要切换到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将通知您何时需要从任何通道读取