Cliente Socket "Preso"

0 respostas
betorpf

Boa tarde, pessoal
Não sei se é bem esse o nome do meu problema, mas vamos lá.

Preciso realizar uma integração entre o meu sistema e o sistema de um parceiro a partir de conexões socket.

O sistema parceiro, deixa uma applet java escutando a porta 1111 do computador local.
Então o meu sistema deve encaminhar uma mensagem para essa porta, por exemplo

Agora o meu problema:
O applet do parceiro fica aguardando a conexão com a mensagem "aguardando conexão..."
O Meu applet inicia, cria um ServerSocket.
Ao criar um ServerSocket, a mensagem do outro sistema muda para "Aguardando Informação..."
Solicito um accept e cria um novo Socket.
Envio a mensagem, e fecho todos os objetos que uso (segue código abaixo), e fecho o applet.

O problema é o seguinte:
Algumas vezes ao fechar as conexões e os objetos socket, vejo pelo console do java dele, que aparece a mensagem: "java.net.SocketException: Software caused connection abort: recv failed
"
E assim, eu posso abrir novamente o applet, recriar a conexão e envio uma nova mensagem.
Outras vezes (meu carma), após fechar o meu applet, a conexão aparenta estar aberta. Pois ao reabrir o applet, não passa da linha de accept. Apenas dá exception se eu setar o TimeOut.

O que pode estar acontecendo? Tem como eu reaproveitar uma conexão antiga, ou finalizar de vez essa, a partir do meu lado?

Código:
public void EnviarMensagem() throws IOException
    {
    	
    	if(enviado==true)
    		return;
    				
    	ServerSocket echoServer = null;
    	Socket echoSocket = null;
        PrintWriter out = null;
        BufferedReader in = null;
    	
        
    	try
    	{
    		echoServer = new ServerSocket(Integer.parseInt(sPorta));  
    	}
    	catch (IOException e)
    	{
    		System.err.println(e.getMessage());
    	}
    	if(echoServer != null)
    	{
    		System.err.println("Servidor listening porta " + sPorta );
    	}


        try 
        {      
        	//timeout
        	//echoServer.setSoTimeout(2000);
        	
        	System.err.println("tenta conectar");
        	echoSocket = echoServer.accept();
        	System.err.println("echoServer.accept");
        	in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
        	System.err.println("in new");
			out = new PrintWriter(echoSocket.getOutputStream());
			System.err.println("out new");
        } 
        catch (UnknownHostException e) 
        {
            System.err.println("Don't know about host: " + sEndereco + ".");
        } 
        catch (IOException e) 
        {
            System.err.println("Couldn't get I/O for "
                               + "the connection to: " + sEndereco + ".");
            System.err.println(e.getMessage());
        }
        catch(Exception e)
        {
        	System.err.println("Erro na conexão " + sEndereco + " " + sPorta + " " + e.getMessage());
        }
        
        BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
        System.err.println(sMensagem);
        String userInput = sMensagem;
        out.println(userInput);
        out.flush();
        System.err.println("enviou");

        /*
        while ((userInput = stdIn.readLine()) != null) 
        {
		    out.println(userInput);
		    //System.out.println("echo: " + in.readLine());
        }
        */
        
        try
        {
        	
			out.close();
			in.close();
			stdIn.close();	
        }
        catch(IOException e)
        {
        	System.err.println("Erro no Encerramento IOException:" + e.getMessage());
        	
        }
        catch(Exception e)
        {
        	System.err.println("Erro no Encerramento Exception:" + e.getMessage());
        	
        }
        finally
        {

        	echoSocket.close();
        	echoServer.close();
			System.err.println("FECHOU!");	
			
			echoSocket=null;
			echoServer = null;
			System.err.println("Sockets - NULL!");	
			
			System.exit(0);
        }
    }
Criado 27 de julho de 2012
Respostas 0
Participantes 1