Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我需要一个单独的插座和线程为每个球员加入?[爪哇]_Java_Multithreading_Sockets_Multiplayer - Fatal编程技术网

Java 我需要一个单独的插座和线程为每个球员加入?[爪哇]

Java 我需要一个单独的插座和线程为每个球员加入?[爪哇],java,multithreading,sockets,multiplayer,Java,Multithreading,Sockets,Multiplayer,我学习套接字已经有一段时间了(我还很年轻),我认为我对java套接字掌握得很好。我决定创建一个简单的多人Java 2D社交游戏。我的目标是让服务器输出玩家的X,Y坐标,并每10毫秒进行一次聊天。从我所读到的,我非常普通的逻辑告诉我,一次只有一个用户可以连接到一个套接字。因此,我将需要一个单独的线程和插座为每个球员,连接 每个播放器必须有一个服务器套接字和线程吗?是 套接字是两点(客户端和服务器)之间的连接。这意味着每个播放器都需要自己的服务器端套接字连接 如果希望应用程序以任何有意义的方式响应,

我学习套接字已经有一段时间了(我还很年轻),我认为我对java套接字掌握得很好。我决定创建一个简单的多人Java 2D社交游戏。我的目标是让服务器输出玩家的X,Y坐标,并每10毫秒进行一次聊天。从我所读到的,我非常普通的逻辑告诉我,一次只有一个用户可以连接到一个套接字。因此,我将需要一个单独的线程和插座为每个球员,连接

每个播放器必须有一个服务器套接字和线程吗?

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

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


这使得连接速度较慢的客户端不会成为其他客户端的瓶颈。这还意味着,如果客户端连接丢失,您就不会为等待超时的任何更新带来负担。

您应该只有一个
ServerSocket
侦听客户端已知的端口。当客户机连接到服务器时,将创建一个新的
Socket
对象,并且原始的
ServerSocket
将重新开始侦听。然后,您应该剥离一个新的
线程
,或者将与客户端对话的实际工作交给
执行者
,否则您的服务器将停止侦听客户端连接

下面是您需要的代码的基本草图

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

是的。一个ServerSocket,但多个套接字和线程来处理客户端。注意创建无限线程!你最好限制线程的总数。您最好在此处使用
ExecutorService
。我是否应该创建一个处理连接的套接字,然后将用户定向到一个唯一的套接字?