Java中的Socket服务器多线程资源问题
我正在从事一个类似HQ trivia的项目,其中多个客户端连接到服务器并提交他们对一个问题的答案,为此我用java编写了代码,其中用户连接到一个ServerSocket,并为每个客户端创建了一个新线程。可能有成千上万的客户。虽然只测试100个客户端,但服务器的CPU使用率达到95%。我在下面提供了一些代码。如果有人能帮我找到一个有效的方法来处理这么多客户,我将不胜感激 主类的源 可运行的客户端工作类 服务器规格为HDD:451G CPU:24 RAM:16GJava中的Socket服务器多线程资源问题,java,multithreading,serversocket,Java,Multithreading,Serversocket,我正在从事一个类似HQ trivia的项目,其中多个客户端连接到服务器并提交他们对一个问题的答案,为此我用java编写了代码,其中用户连接到一个ServerSocket,并为每个客户端创建了一个新线程。可能有成千上万的客户。虽然只测试100个客户端,但服务器的CPU使用率达到95%。我在下面提供了一些代码。如果有人能帮我找到一个有效的方法来处理这么多客户,我将不胜感激 主类的源 可运行的客户端工作类 服务器规格为HDD:451G CPU:24 RAM:16G 提前感谢您的帮助。您需要一个非阻塞实
提前感谢您的帮助。您需要一个非阻塞实现-使用
SocketChannel
()或一个预先存在的框架,如Netty。另请参阅。您需要一个非阻塞实现—使用SocketChannel
()或一个预先存在的框架,如Netty。另请参阅。
public class Server {
//static ServerSocket variable
private static ServerSocket server;
//socket server port on which it will listen
private static int port = 9876;
public static void main(String[] args) throws IOException, ClassNotFoundException {
try {
server = new ServerSocket(port);
while(true){
ClientWorker w;
try{
//server.accept returns a client connection
System.out.println("Waiting for a connection to accept.");
w = new ClientWorker(server.accept(), this);
Thread t = new Thread(w);
t.start();
} catch (IOException e) {
System.out.println("Accept failed: 9876");
System.exit(-1);
}
}
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
class ClientWorker implements Runnable {
Server server;
private Socket client;
private String clientName = "";
private String id = "";
PrintStream printStream;
BufferedReader bufferedReader;
//Constructor
ClientWorker(Socket client, Server server) {
this.client = client;
this.server= server;
}
@Override
public void run() {
try {
bufferedReader = new BufferedReader(new InputStreamReader(client.getInputStream()));
printStream = new PrintStream(client.getOutputStream());
while(client.isConnected())
{
String message = bufferedReader.readLine();
//Some logical operation on users message
printStream.println("response");
}
}
}
}