Принудительно закрыть все сокеты в Java

Рейтинг: 0Ответов: 1Опубликовано: 11.05.2011

Имеется приложения flash AS3 клиент -- socket -- Java EJB модуль на сервере GlassFish.

Если соединение с одним или несколькими клиентами активно и я делаю undeploying этого EJB модуля, соединения как-то плохо обрываются и порт сервера остаётся открытым. И такая ситуация очень не нравится, потому что порт так и остаётся занятым до перезапуска GlassFish или всей виртуальной машины.

Ну и вопрос, естественно, как принудительно закрыть все порты и сокеты при свёртывании модуля?

Я даже не знаю, какой кусок кода выкладывать, ну вот, например:

в EJB классе:

@PreRemove
@PreDestroy
@PostRemove
private void Destroy() throws InterruptedException{
    Server.stopServer();
}

В классе Server

public static void stopServer(){
    IsActiveS = false;
    for(Server e : Connections){
        e.drop();
    }
    try {
        if(SeSocket!=null){
            if(!SeSocket.isClosed())
                SeSocket.close();
            SeSocket = null;
        }
    } catch (IOException ex) {
        if(Settings.DEBUG)System.out.println("Error occured while closing socket: " + ex.getMessage());
    }
}

если переменная IsActiveS = false, то все циклы, которые есть в классе завершаются
Connections - список активных соединений
IsActive то же самое, что и IsActiveS только для одного экземпляра соединения

public void drop(){
    isActive = false;
    try {
        if(socket!=null){
            socket.shutdownInput();
            socket.shutdownOutput();
            socket.setSoTimeout(1);
            socket.close();
        }
    } catch (IOException ex) {}
    if(outStreamWriter!=null){
        try{
            outStreamWriter.close();
        }catch (Exception ex){}
        outStreamWriter = null;
    }
    if(inStreamReader!=null){
        try{
            inStreamReader.close();
        }catch (Exception ex){}
        inStreamReader = null;
    }
    if(socket!=null)socket = null;
    Connections.remove(this);
}

Ответы

Ответов пока нет.