Cho*_*ate 21 java multithreading serversocket
我ServerSocket在我的应用程序中使用a时遇到问题.
我正在ServerSocket我的应用程序的构造函数中创建它.套接字的构造函数调用该accept()方法以等待客户端连接.
问题是该accept()方法冻结了我的整个应用程序,直到客户端连接.所以我想问一下是否有另一种方法可以ServerSocket在一个单独的线程中创建整体,在我的主应用程序旁边调用ServerSocket它的构造函数和它的accept()方法?
编辑:
感谢Olivier的建议,将.accept放入runnable并创建一个线程池来处理客户端连接.
那是我现在的代码:
public void start(){
final ExecutorService clientProcessingPool = Executors.newFixedThreadPool(10);
Runnable serverTask = new Runnable() {
@Override
public void run() {
try {
serverSocket = new ServerSocket(port);
while (true) {
Socket clientSocket = serverSocket.accept();
objectout = new ObjectOutputStream(clientSocket.getOutputStream());
clientProcessingPool.submit(new ClientTask(clientSocket,objectout));
}
} catch (IOException e) {
System.err.println("Accept failed.");
}
}
};
Run Code Online (Sandbox Code Playgroud)
万事都好!谢谢!
Oli*_*ier 42
通常,我使用N + 1个线程:一个用于ServerSocket,以避免阻塞整个应用程序等待客户端连接; 和N个线程来处理客户端的请求,N是线程池的大小(我建议使用线程池而不是为每个客户端创建一个新线程).
这是一个例子(只是编码它,您可能希望有更好的异常管理等,但这是一个最小的工作示例)
public class Server {
public static void main(String[] args) {
new Server().startServer();
}
public void startServer() {
final ExecutorService clientProcessingPool = Executors.newFixedThreadPool(10);
Runnable serverTask = new Runnable() {
@Override
public void run() {
try {
ServerSocket serverSocket = new ServerSocket(8000);
System.out.println("Waiting for clients to connect...");
while (true) {
Socket clientSocket = serverSocket.accept();
clientProcessingPool.submit(new ClientTask(clientSocket));
}
} catch (IOException e) {
System.err.println("Unable to process client request");
e.printStackTrace();
}
}
};
Thread serverThread = new Thread(serverTask);
serverThread.start();
}
private class ClientTask implements Runnable {
private final Socket clientSocket;
private ClientTask(Socket clientSocket) {
this.clientSocket = clientSocket;
}
@Override
public void run() {
System.out.println("Got a client !");
// Do whatever required to process the client's request
try {
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
34916 次 |
| 最近记录: |