多线程套接字-无法优雅地关闭套接字



在我的主线程中,我有一个while(侦听)循环,它在我的ServerSocket对象上调用accept(),然后启动一个新的客户端线程,并在接受新客户端时将其添加到Collection中。但是,while(侦听)循环中的accept()调用阻塞了,我正在努力关闭连接。请找到我下面的示例代码,是否有任何方法来创建包装器服务来关闭下面的服务器端程序的套接字连接。

public static final void serverSocket(IData pipeline) throws ServiceException {
    int clientNumber = 0;
    ServerSocket listener = null;
    int port =0;
    Properties socketProperties = new Properties();
    try
    {   
        listener = new ServerSocket(port);
        System.out.println(listener.getLocalSocketAddress());           
    }
    catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        while(true){
            new Connections(listener.accept(), clientNumber++).start();
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
    } 
    finally{
        try {
            listener.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
private static class Connections extends Thread {
    private Socket socket;
    private int clientNumber;

    public Connections(Socket socket, int clientNumber) {
        this.socket = socket;
        this.clientNumber = clientNumber;
        log("New connection with client# " + clientNumber + " at " + socket);
    }
   public void run()
    {
        try {
            // Send a welcome message to the client.
            while (true) 
            {
                // my program
            }
         catch (IOException e) {
            //exception
        } 
        finally {
            try {
                socket.close();
            } 
                catch (IOException e) {
       log.error("Couldn't close a socket, what's going on?");
            }
            log("Connection with client# " + clientNumber + " closed");
        }
    }

您没有充分描述决定何时关闭的情况。

在任何情况下,你的serverSocket对象都可以成为一个静态字段,可供其他线程使用,并且其他线程可以决定何时关闭。

最新更新