-1

即使抛出错误或异常,我也想保持我的套接字服务器打开

这是我的服务器

编辑:

public void serveur()
{
     int maxConnectionAllowed=2;
     int port=5000;

    try{

        serveur = new ServerSocket(port);
        serveur.setReuseAddress(true);
        System.out.println("Waiting for connection");

        while (true) {
            synchronized (connectedCount) {
                while (connectedCount.get() >= maxConnectionAllowed) {
                    try {
                        connectedCount.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
            Socket socket = serveur.accept();   
            factory.processRequest(socket,connectedCount);
        }           
    }



    catch(SocketException sException){
        System.err.println("Error when a socket connects");

    }   
    catch(IOException ioException){
        System.err.println("Error when reading output/input datas");

    }   
      }
public void run() {
    serveur();
}

例如,同时允许的 maxConnection 是 2 ,但是我连接了第三个,抛出异常java.net.ConnectException: Connection refused: connect并且我的 serversocket 已关闭我希望服务器继续运行,直到有一个地方可用。

编辑:

工厂方法

public void processRequest(Socket socket,AtomicInteger connectedCount) {
    try
    {

    RequestTreatment requestTreatment= new RequestTreatment(socket,connectedCount);
    Thread threadWorker= new Thread(requestTreatment);
    threadWorker.start();
    }
    finally
    {
        compteurConnexion.incrementAndGet();
        synchronized (connectedCount) {
            connectedCount.notify();
        }
    }

}

}

请求治疗等级

public RequestTreatment(Socket socket) {
    super();
    this.socket=socket;

}
@Override
public void run() {
            try
            {
            requestTreatment();
            }
             finally
             {
                try {
                socket.getInputStream().close();
                socket.getOutputStream().close();
                socket.close();
                    } catch (IOException e) {
                e.printStackTrace();
                 }

            }
          }



public void treatment() {
        try {
            in = socket.getInputStream();
            out = socket.getOutputStream();

            // do stuff 

        } catch (IOException e) {
            e.printStackTrace();
             } 
        }
    }

非常感谢

4

2 回答 2

1

我建议您让您的服务器接受它可以接受的所有连接并将它们存储在某种列表或映射中(最好是线程安全版本),并具有通过 2 个线程池一次处理 2 个连接的机制。当一个进程结束时,您可以从列表中获取最旧的套接字连接并进行处理。

编辑:

我看到您不想允许第三个连接,所以我将代码更改为:

While(true){
    Socket socket = serveur.accept();
    if(nbClient++< maxConnectionAllowed) factory.processRequest(socket);
    //Else just close the connection and start the loop again
}
于 2012-09-06T13:57:02.967 回答
1
finally{
        try{
            in.close();
            out.close();
            socket.close();
        }
        catch(IOException ioException){
            ioException.printStackTrace();
        }
    }

问题就在这里。您正在启动一个新线程来处理套接字,然后您将进入这个关闭套接字的 finally 块,而线程仍在运行。所以线程遇到“套接字关闭”异常。请注意,这不是客户所接受的,ServerSocket,而是Socket客户所接受的。这段代码应该在线程代码的 finally 块中,而不是在这里。

你这里还有一个问题:

public RequestTreatment(Socket socket)
{
    super();
    this.socket=socket;
    threadWorker= new Thread(this);
    threadWorker.start();
}

此代码在完全构造之前泄漏了“this”。你不应该在这里启动线程,你应该在你做的地方启动它new RequestTreatment()

于 2012-09-07T05:46:31.153 回答