Fechar conexão / socket

6 respostas
M

Estou tentando evitar com que um mesmo usuário se conecte mais de uma vez algo assim:
Pelo lado do servidor:

if(se usuário já logado){
   objetoInput.close();
   objetoOutput.close();
   objetoSocket.close();
}

Pelo lado do Usuario:

//dentro do metodo run() if(socket.isClosed()){ JOptionPane.showMessage(null, "Usuario já logado!!"); }else{ inciaPrograma(); }

Pelo lado do servidor este erro:

java.io.StreamCorruptedException:

Pelo lado do usuário não inicia o método InciaPrograma() mas aceita a conexão.
E se abro outa janela (usuário) para tentar outra conexão retorna: “Software caused connection abort: rcv failed”.

6 Respostas

T

Não queria ser chato, mas como já vi gente ser despedida por encapsular um ObjectInputStream/ObjectOutputStream em um Socket, eu aconselharia a tentar uma outra solução. É que há vários problemas com esse encapsulamento.

Veja se você não está precisando dar “shutdown” no socket , além de dar um “flush”.

M

Sem problema!!Quando tento logar com mesmo usuário on-line dá isso:
java.lang.NullPointerException;
E inicia a aplicação. A condição é essa:

if(!conexao.isConnected()){
       JOptionPane.showMessageDialog(null, "Usuario já cadastrado!!", "Erro!", JOptionPane.ERROR_MESSAGE);
       fLogin.requestFocus();
 }else{
       setVisible(false);
       new IMPrincipal().setVisible(true);
 }

O Servidor recusa o usuário, mas o mesmo é conectado!!

M

E pelo servidor a condição é essa:

//uOn- usuário já´online
 if(uOn){
                input.close();
                output.close();
                socket.shutdownInput();
                socket.shutdownOutput();
                socket.close();
            }else{
                dlm.addElement(msg.getDUsu().getLogin());
                mUsuarios.put(msg.getDUsu(), socket);
                aMsgs.append(msg.getDUsu().getLogin() + " acabou de entrar!\n");
            }
T
input.close();  
                 output.close();  
                 socket.shutdownInput();  
                 socket.shutdownOutput();  
                 socket.close();

Quando você encapsula uma XOutputStream em outra YOutputStream, quando você fecha a mais externa, são fechadas as mais internas (por exemplo, encapsular um ObjectOutputStream em um SocketOutputStream, e você fechar o ObjectOutputStream, acaba fechando o socket primeiro. Então você deve dar o shutdown no socket ANTES de fechar o ObjectOutputStream, senão vai tentar dar um shutdown em um socket que já está fechado.

M

java.io.EOFException!
Que um fim de arquivo ou stream foi alcançado inexperadamente durante o input!

M

Acho que estou fechando algo antes!?

Criado 5 de fevereiro de 2009
Ultima resposta 5 de fev. de 2009
Respostas 6
Participantes 2