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