我已经学习套接字有一段时间了(我还很年轻),我认为我对 Java 套接字有很好的掌握。我决定创建一个简单的多人 Java 2D 社交游戏。我的目标是让服务器每 10 毫秒输出一次玩家的 X、Y 坐标和聊天。根据我的阅读,我的平均逻辑告诉我,一次只有一个用户可以连接到套接字。因此,我需要为每个连接的玩家提供一个单独的线程和套接字。
每位玩家是否必须拥有一个 ServerSocket 和线程?
我已经学习套接字有一段时间了(我还很年轻),我认为我对 Java 套接字有很好的掌握。我决定创建一个简单的多人 Java 2D 社交游戏。我的目标是让服务器每 10 毫秒输出一次玩家的 X、Y 坐标和聊天。根据我的阅读,我的平均逻辑告诉我,一次只有一个用户可以连接到套接字。因此,我需要为每个连接的玩家提供一个单独的线程和套接字。
每位玩家是否必须拥有一个 ServerSocket 和线程?
您应该只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有一个很好的教程。
是的。
套接字是两点(客户端和服务器)之间的连接。这意味着每个玩家都需要在服务器端拥有自己的套接字连接。
如果您希望您的应用程序以任何有意义的方式响应,那么服务器上的每个传入连接都应该在它们自己的线程中处理。
这使得可能连接速度较慢的客户端不会成为其他人的瓶颈。这也意味着,如果客户端连接丢失,您无需承担任何等待超时的更新。