所以我试图做的是有一个套接字接收客户端的输入,将客户端放入队列,然后当我的算法返回true时,向队列中的每个客户端返回一条消息。
这个队列应该同时支持几百个客户端,但同时不会对服务器产生影响,因此它实际上可以做它应该做的事情。
这是我到目前为止所做的:
private static final int PORT = 25566;
private static final int THREADS = 4;
private ExecutorService service;
public void init() throws IOException, IllegalStateException {
ServerSocket serverSocket;
serverSocket = new ServerSocket(PORT);
service = Executors.newCachedThreadPool();
Socket socket;
while(true) {
socket = serverSocket.accept();
System.out.println
("Connection established with " + socket.getInetAddress().toString());
service.execute(() -> {
Scanner scanner = null;
PrintWriter output = null;
String line = null;
try {
scanner = new Scanner(new InputStreamReader(socket.getInputStream()));
output = new PrintWriter(socket.getOutputStream());
} catch(IOException e) {
e.printStackTrace();
}
try {
if (scanner == null || output == null)
throw new IllegalStateException("Scanner/PrintWriter is " + "null!");
line = scanner.nextLine();
while (line.compareTo("QUIT") != 0) {
/* This is where input comes in, queue for the algorithm,
algorithm happens then returns appropriate values */
output.flush();
line = scanner.nextLine();
}
} finally {
try {
System.out.println
("Closing connection with " + socket.getInetAddress().toString());
if(scanner != null) {
scanner.close();
}
if(output != null) {
output.close();
}
socket.close();
} catch(IOException e) {
e.printStackTrace();
}
}
});
}
}
现在我认为会发生这种情况,如果队列达到足够高的水平,我的线程池将完全瓶颈服务器,因为所有线程都用于处理队列中的客户端,并且赢得了#39;足够处理算法。
编辑:经过一系列的测试后,我认为如果在算法中它返回值然后断开连接,而不是等待用户响应,但在满足某些条件后让用户客户端重新连接,它将会有效。
答案 0 :(得分:1)
除非您受机器限制,否则您的瓶颈不太可能是处理能力。更有可能发生的是线程池中的所有线程都被消耗掉并最终等待来自客户端的输入。您的设计只能同时处理尽可能多的客户端,因为池中有线程。
对于几百个客户端,您可以考虑为每个客户端创建一个线程。可以支持的线程数量的限制资源通常是每个线程所需的堆栈的内存,而不是处理能力;对于具有充足内存的现代机器,根据个人经验,千线程不是问题。可能存在操作系统参数,限制了您可能必须调整的线程数。
如果需要处理大量客户端,可以设置代码以轮询套接字以获取可用输入,并仅对那些要处理输入的套接字进行处理。