维护服务器套接字打开

时间:2012-09-06 13:44:28

标签: java multithreading sockets

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

这是我的服务器

编辑:

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 simultaneous allowed允许为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();
             } 
        }
    }

非常感谢

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分: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()的地方开始。