我正在使用套接字实现代理,我需要在需要时停止/启动ServerSocket,问题是我正在执行服务器作为线程,我不知道如果线程是运行...
编辑,新代码:
public void startServer() throws IOException {
final ExecutorService clientProcessingPool = Executors.newFixedThreadPool(10);
Runnable serverTask = new Runnable() {
@Override
public void run() {
try {
@SuppressWarnings("resource")
ServerSocket serverSocket = new ServerSocket(getPORT());
serverSocket.setSoTimeout(1000);
while (process) {
Socket clientSocket = serverSocket.accept();
clientProcessingPool.submit(new ClientTask(clientSocket));
}
} catch (IOException e) {
e.printStackTrace();
}
}
};
Thread serverThread = new Thread(serverTask);
serverThread.start();
}
任何帮助将不胜感激,谢谢!
答案 0 :(得分:0)
看起来你已经有了摆脱循环的东西 - process
变量。您应该可以通过将process
变量设置为false
来退出循环。
但是,如果没有与套接字建立连接,则serverSocket.accept()将永久阻塞。所以你应该公开一个关闭serverSocket的方法。请参阅以下代码:
class Server {
private ServerSocket serverSocket;
private boolean process = true;
public void startServer() throws IOException {
final ExecutorService clientProcessingPool = Executors.newFixedThreadPool(10);
Runnable serverTask = new Runnable() {
@Override
public void run() {
try {
@SuppressWarnings("resource")
ServerSocket serverSocket = new ServerSocket(getPORT());
serverSocket.setSoTimeout(1000);
Server.this.serverSocket = serverSocket;
while (process) {
Socket clientSocket = serverSocket.accept();
clientProcessingPool.submit(new ClientTask(clientSocket));
}
} catch (IOException e) {
e.printStackTrace();
}
}
};
Thread serverThread = new Thread(serverTask);
serverThread.start();
}
public void closeServer() {
this.process = false;
if (this.serverSocket != null) {
try {
serverSocket.close();
} catch (IOException e) {
//ignore
e.printStackTrace();
}
}
}
}
private ServerSocket serverSocket;
private boolean process = true;
public void startServer() throws IOException {
final ExecutorService clientProcessingPool = Executors.newFixedThreadPool(10);
Runnable serverTask = new Runnable() {
@Override
public void run() {
try {
@SuppressWarnings("resource")
ServerSocket serverSocket = new ServerSocket(getPORT());
serverSocket.setSoTimeout(1000);
Server.this.serverSocket = serverSocket;
while (process) {
Socket clientSocket = serverSocket.accept();
clientProcessingPool.submit(new ClientTask(clientSocket));
}
} catch (IOException e) {
e.printStackTrace();
}
}
};
Thread serverThread = new Thread(serverTask);
serverThread.start();
}
public void closeServer() {
this.process = false;
if (this.serverSocket != null) {
try {
serverSocket.close();
} catch (IOException e) {
//ignore
e.printStackTrace();
}
}
}