Erro Socket (Windows XP)

11 respostas
M

Olá a todos.

Galera é o seguinte, estou desenvolvendo uma aplicacao basica cliente-servidor, o cliente tem que enviar um arquivo para o servidor… apenas isso.

O Problema é o seguinte, esta dando este erro aqui apenas no Windows XP, em casa, no Windows Vista e Windows 7 não ocorre este erro, gostaria de saber o pq.

O Erro:

java.net.BindException: Address already in use: connect
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
        at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
        at java.net.Socket.connect(Socket.java:519)
        at java.net.Socket.connect(Socket.java:469)
        at java.net.Socket.<init>(Socket.java:366)
        at java.net.Socket.<init>(Socket.java:209)
        at principal.Enviar.EnviaBytes(Enviar.java:324)
        at principal.Enviar.run(Enviar.java:108)

O meu metodo EnviarBytes da minha THREAD Enviar, segue abaixo:

public void EnviaBytes(byte[] bytes) throws IOException{
try {
                    ipServidor = InetAddress.getByName(ip);
                } catch (UnknownHostException ex) {
                    ex.printStackTrace();
                }

                Socket s = null;
                try {
                    
                    s = new Socket(ipServidor, porta);
                } catch (IOException ex) {
                    ex.printStackTrace();
                }

            OutputStream out = null;
                try {
                    out = s.getOutputStream();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
         

   
            //Enviando os bytes
            out.write(bytes);
            out.flush();
            s.close();
}

Ou seja, ele pega o arquivo, “picota” em varios pedaços de array de bytes, eu tenho uma thread Enviar, que faz um laço(While) que vai chamando este meotdo enviar bytes e vai enviando os bytes pro servidor.

No Windows 7 e vista não da este erro, apenas no XP.

Alguem tem alguma luz?

Forte Abraço!

11 Respostas

CarvalR2

Dzae MKThEbEsT,

Sim, tenho algumas idéias que podem ajudá-lo. Faz uns testes aí:

  • A porta está alta ? use números altos. Por exemplo a partir de 5000 no servidor. O Windows usa portas baixas e muitas são reservadas a pilha TCP.
  • Coloque:
    ipServidor = InetAddress.getByName(ip);
    s = new Socket(ipServidor, porta);
    out = s.getOutputStream();
    out.write(bytes);
    out.flush();
dentro de apenas 1 try/catch/finally. Declare s e out fora do try/catch como esta fazendo mesmo

E no finally coloque o close tanto para out quanto para s, nesta ordem:

if (out != null) { out.close(); }

if (s != null) { s.close(); }

Então, o erro ainda acontece depois dessas mudanças ?

lina

Oi,

O erro foi apresentado porque a porta de comunicação já está sendo utilizada pelo Sistema Operacional (Win xp).
Modifique a mesma e faça o teste…

Tchauzin!

M

Obrigado a todos.

Mas antes vou relatar o que acontece com precisão, eu consigo enviar varios bytes, ou seja, o erro acontece durante o envio dos bytes… consigo enviar cerca de 20% do arquivo até ocasionar o erro.

E ja tentei portas altas, tpw 5555 e continua o erro.

Vou tentar fazer o que o Caval disse e logo retorno.

Abraço!

M

Não deu certo não =/.

É uma coisa impressionante, no Windows XP ocasiona isso… em Windows vista e 7 não da nada…

Agradeço a todos pela atenção.

Qualquer ajuda sera bem vinda.

Abraço!

CarvalR2

OK… vamos fazer mais um teste ?

declare ipServidor dentro do seu metodo . .como uma variavel de metodo e não de objeto …
sempre que chamar o Enviar , esta variavel sera criada … testa ai … nao custa

CarvalR2

faz essa mudança junto com as outras que tinha mencionado …

to apostando que o problema esteja em liberação de recursos.

pois seu metodo Enviar eh chamado varias vezes

M

O Que eu estou achando é mais ou menos por ae Caval.

Percebi o seguinte, qnd do um Thread.Sleep(quanto maior os milissegndos, maior a quantidade de bytes enviados).

To testando aqui com o Thread.sleep(50) e ate agora ta indo, ou seja… dps q envio os bytes e do close, do um tempim pra thread.

Vamo ver o q vai dar.

saulods

Um Utilitario:

Vc pode ficar vendo a porta, será que alguma outra aplicação não está matando essa conexão?

Verificar porta:

espero ter ajudado

[]s

CarvalR2

Saquei … pode ser recurso mesmo… o sleep da um tempo para a coisa andar certinha.

O servidor de socket é feito para aguentar várias conexões simultâneas. E creio que a parametrização default é mais de uma conexão ao mesmo tempo.

O cliente de socket daria pau se tivesse atropelando recurso … ou compartilhando variavel ao mesmo tempo … por isso te falei para colocar variaveis todas como local, dentro do metodo, inclusive o inetaddress.

Outra era que tava faltando o close do outputstream, o que causa memory leak.

M

Opa, Saulo.

Obrigado pela atencao, não teria como ver isso no java?se a porta esta disponivel?

Abraço!

briansiervi

MKThEbEsT, eu tive esse mesmo problema. Mas a minha aplicação é uma aplicação normal de conexão ao banco de dados.
Isso estava ocorrendo porque eu estava criando vários "Statement". Eu então solucionei verificando se já estava instanciado. Ex:

private static Statement confirmacao= null; 
private static Connection conexao;

private void Teste(){
try{
// estava faltando a informação desse trecho 
	if(confirmacao != null){
		confirmacao.close();
	}
//até aqui.

	confirmacao= conexao.createStatement();
	ResultSet resultSet= confirmacao.executeQuery(query);
	while(resultSet.next()){ 
		int i= 0;						
		while(i < coluna.length){
			i++;
		}
	}
	System.out.println(" Seleção realizada.");
	}catch(SQLException e){
		e.printStackTrace();
	}
}

Talvez você esteja fazendo algo semelhante em sua aplicação...
Vlw.

Criado 4 de junho de 2010
Ultima resposta 19 de out. de 2010
Respostas 11
Participantes 5