我是否需要为每个加入的玩家提供单独的套接字和线程? [JAVA]

时间:2013-06-20 06:21:07

标签: java multithreading sockets multiplayer

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

每个播放器是否需要一个ServerSocket和线程?

2 个答案:

答案 0 :(得分:7)

您应该只有一个ServerSocket监听客户端已知的端口。当客户端连接到服务器时,会创建一个新的Socket对象,原始的ServerSocket会再次返回监听状态。然后,您应该剥离新的Thread或将Executor与客户端交谈的实际工作移交给您,否则您的服务器将停止侦听客户端连接。

以下是您需要的代码的 very 基本草图。

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包。有一个很好的教程over at IBM

答案 1 :(得分:3)

是。

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

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

这允许可能具有缓慢连接的客户端不会成为其他人的瓶颈。这也意味着如果客户端连接丢失,则不会对等待超时的任何更新负担。