gpt4 book ai didi

java - 如何处理客户端-服务器 java 应用程序中的线程数?

转载 作者:行者123 更新时间:2023-12-01 14:47:10 24 4
gpt4 key购买 nike

正如标题所示,我正在实现一个小项目,该项目允许客户端使用多线程连接到服务器来管理连接。我想限制连接,当服务器充满请求时,其他客户端应该放入队列中,例如:服务器只允许 2 个客户端同时连接服务器,其他客户端直到轮到为止。

这是我的服务器类

public class Server {

static BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in));
//Declare an instance of CommandParameter class

static CommandParameter par;
//Initialize a BufferedReader and BufferedWriter
static BufferedReader bufferedReader;
static BufferedWriter bufferWriter;
//
static int port;
static String serverData;
static int proc_count;
private static String command;

public static void main(String[] args) throws Exception {
command = userInput.readLine();
System.out.println("Server is available");
//Thread.sleep(2000);
processCommand(command);
startServer(port);

}

public static void startServer(int port) {
ServerSocket serverSocket = null;
try {
//create a port for server in order to listen incoming connections
serverSocket = new ServerSocket(port);
//allow client connect to server

} catch (IOException e) {
System.out.println(e);
}
while (true) {
try {
new ThreadSocket(serverSocket.accept(),serverData).start();

} catch (IOException ex) {
System.out.println("Server starts fail");
}
}
}

public static void processCommand(String input) {
//assign the user input to an String array
String inputLine = input;
int commandCount = checkCommand(inputLine);
if(commandCount>3 || commandCount ==-1){
System.out.println("Invalid command");
System.exit(1);
}
//assign the user input to an String array
String[] command = inputLine.split(" ");
par = new CommandParameter();

//JCommander parses the command to get the pairs parameter name and value
JCommander jc = new JCommander(par, command);
port = par.getPort();
serverData = par.getServerdata();
proc_count = par.getProc_count();
}
public static int checkCommand(String inputLine) {
int count = 0;
if (inputLine.contains("-port")) {
count++;
}else if (inputLine.contains("-data")) {
count++;
} else if (inputLine.contains("-proc_count")) {
count++;
} else{
return -1;
}

return count;
}
}

有什么想法吗?

最佳答案

这正是异步 IO 最有用的地方。 【大量的IO请求需要由有限数量的工作线程来处理】。大多数现代操作系统中都有允许异步 IO 操作的系统调用。例如,Linux 中的 epoll,Windows、AIX 和 Solaris 中的 IOCP,BSD 版本和 Mac OS 中的 KQueue。在java中, native 非阻塞调用被抽象在不同的​​SPI后面 - 示例 - sun.nio.ch.WindowsSelectorImpl、sun.nio.ch.KQueueSelectorImpl、sun.nio.ch.EPollSelectorImpl 等。

我推荐你使用的是Netty .

使用较少的固定数量线程为大量 HTTP 请求提供服务的示例是使用 netty API 的简单任务。

具有一个监听器线程和两个工作线程的示例 Bootstrap 代码如下所示

public static void setupHTTPListeners()
{
ServerBootstrap bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(Executors.newFixedThreadPool(1),
Executors.newFixedThreadPool(2)));
-----
-----
}

在相同的背景下,最受欢迎的读物之一是这里 - The C10k problem .

关于java - 如何处理客户端-服务器 java 应用程序中的线程数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15312041/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com