我一直在学习插座(我很年轻),我认为我对java套接字有很好的把握。我决定创建一个简单的多人Java 2D社交游戏。我的目标是让服务器输出玩家的X,Y坐标并每10毫秒聊天一次。根据我的阅读,我的平均逻辑告诉我,一次只有一个用户可以连接到套接字。因此,对于每个连接的玩家,我都需要一个单独的线程和套接字。
每个播放器是否需要一个ServerSocket和线程?
答案 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是两点(客户端和服务器)之间的连接。这意味着每个播放器在服务器端都需要自己的套接字连接。
如果您希望应用程序以任何有意义的方式响应,那么服务器上的每个传入连接都应该在自己的线程中处理。
这允许可能具有缓慢连接的客户端不会成为其他人的瓶颈。这也意味着如果客户端连接丢失,则不会对等待超时的任何更新负担。