5

我已经学习套接字有一段时间了(我还很年轻),我认为我对 Java 套接字有很好的掌握。我决定创建一个简单的多人 Java 2D 社交游戏。我的目标是让服务器每 10 毫秒输出一次玩家的 X、Y 坐标和聊天。根据我的阅读,我的平均逻辑告诉我,一次只有一个用户可以连接到套接字。因此,我需要为每个连接的玩家提供一个单独的线程和套接字。

每位玩家是否必须拥有一个 ServerSocket 和线程?

4

2 回答 2

8

您应该只ServerSocket在客户端已知的端口上监听一个。当客户端连接到服务器时,Socket会创建一个新对象,而原来的对象ServerSocket又会重新开始监听。然后您应该分拆一个新的Thread或移交Executor给与客户端对话的实际工作,否则您的服务器将停止侦听客户端连接。

这是您需要的代码的非常基本的草图。

import java.net.*;
import java.util.concurrent.*;

public class CoordinateServer {
  public static void main(String... argv) throws Exception {
    // 'port' is known to the server and the client
    int port = Integer.valueOf(argv[0]);
    ServerSocket ss = new ServerSocket(port);

    // You should decide what the best type of service is here
    ExecutorService es = Executors.newCachedThreadPool ();

    // How will you decide to shut the server down?
    while (true) {
      // Blocks until a client connects, returns the new socket 
      // to use to talk to the client
      Socket s = ss.accept ();

      // CoordinateOutputter is a class that implements Runnable 
      // and sends co-ordinates to a given socket; it's also
      // responsible for cleaning up the socket and any other
      // resources when the client leaves
      es.submit(new CoordinateOutputter(s));
    }
  }
}

我把套接字放在这里是因为它们更容易上手,但是一旦你让它工作得很好并且想要提高你的性能,你可能会想要研究这个java.nio.channels包。IBM有一个很好的教程。

于 2013-06-20T08:31:42.157 回答
4

是的。

套接字是两点(客户端和服务器)之间的连接。这意味着每个玩家都需要在服务器端拥有自己的套接字连接。

如果您希望您的应用程序以任何有意义的方式响应,那么服务器上的每个传入连接都应该在它们自己的线程中处理。

这使得可能连接速度较慢的客户端不会成为其他人的瓶颈。这也意味着,如果客户端连接丢失,您无需承担任何等待超时的更新。

于 2013-06-20T06:25:48.940 回答