【问题标题】:ServerSocket issue to stop threadServerSocket 问题停止线程
【发布时间】:2013-12-30 02:29:27
【问题描述】:

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

}

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

【问题讨论】:

    标签: java multithreading sockets proxy


    【解决方案1】:

    看起来你已经有一些东西要打破你的循环 - process 变量。您应该能够通过将process 变量设置为false 来退出循环。 但是,如果没有连接到套接字, serverSocket.accept() 将永远阻塞。所以你应该公开一个关闭serverSocket的方法。请看下面的代码:

    类服务器{

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

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-21
      相关资源
      最近更新 更多