1

我们正在用java制作一个有点RTS的网络游戏。我有这个主服务器,它接受其他拥有 serversocket 的玩家。然后在我们的游戏中,当您创建自己的游戏房间时,我过滤了所有加入我房间的玩家。然后当游戏开始时,房间的创建者应该是主机。我应该继续使用我的主服务器还是应该为那些连接到我房间的人建立一个新的服务器套接字?还有一件事应该是 inputstream.readObject() 消息要进入另一个循环吗?还是它连续循环?这是输入流的示例代码片段。

 public void run() {
    while (running) {
        try {
            inStream = new ObjectInputStream(client.getInputStream());
            command = (String) inStream.readObject();

            Thread.sleep(10);
        }//try
        catch (Exception e) {
            e.printStackTrace();
        }//catch
    }//while
}//run

////接受新客户

while (running) {
        try {
            clientConnecting = serverSocket.accept();
            new TCPServerHandle(clientConnecting).start();
                            Thread.sleep(10);
        }//try
        catch (Exception e) {
            e.printStackTrace();
        }//catch
   }//while
4

2 回答 2

0

对对象 I/O 流使用阻塞 I/O 并不是 RTS 的最佳条件,因为您不希望其他客户端在另一个客户端的登录过程中等待。您可能会认为您可以只对所有内容进行多线程处理以避免等待,但这不会产生太大影响,因为仍然存在阻塞读/写操作。此外,对于对象 I/O 流,必须首先对发送的所有对象进行序列化(称为序列化),这可能是一个相当长的过程,具体取决于您的用户群。如果有很多玩家,那么实际上每一毫秒都很重要。您应该与 s 一起使用非阻塞 I/O(例如 NIO)ByteBuffer。我建议改为查看 NIO 教程,是关于如何制作简单的服务器-客户端应用程序的非常详细的教程。

于 2013-08-29T17:08:09.570 回答
0

您绝对可以为“派对”创建第二个ServerSocket与主机通信的时间。传入的数据包demultiplexed使用端口号发送到正确的进程。您可以设置多个 TCPServerSockets 来侦听和接受不同端口上的传入连接请求。

ServerSocket welcomeSocket = new ServerSocket(portNumber);
Socket clientSocket = welcomeSocket.accept();

是的,在许多情况下,结合使用 TCP 和 UDP 会更有效,因为正如您所提到的,某些数据比其他数据更重要。UDP 仅提供一种best effort服务,其中数据包可能会丢失。如果要设置 UDP 套接字:

DatagramSocket UDPSocket = new DatagramSocket();
于 2013-08-29T17:38:05.943 回答