ServerSocket问题停止线程

时间:2013-12-30 02:29:27

标签: java multithreading sockets proxy

我正在使用套接字实现代理,我需要在需要时停止/启动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();

}

任何帮助将不胜感激,谢谢!

1 个答案:

答案 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(); } } }