[Resolvido]2 sockets um host.(E a exception?)

6 respostas
homisinho

Buenas pessoal,

Digamos que tenha duas threads rodando na minha aplicação,
uma abre um socket para um determinado host, começa a comunicação,
e ao mesmo tempo a outra thread abre outro socket para se comunicar com o mesmo host!

O que deveria acontecer?
A segunda thread ao tentar criar o socket não deveria disparar uma exception?

Pois aqui ela esta gerando o socket e a primeira esta no meio da tarefa perdendo a comunicação.

Desde já obrigado.

6 Respostas

E

Que eu saiba só se o servidor recusar a conexão.

gomesrod

Olá,

Isso é totalmente normal, duas threads (ou duas aplicações, duas máquinas, etc) conectarem-se na mesma porta de um servidor. É assim que funcionam os serviços em geral, capazes de atender a múltiplos clientes simultaneamente.

O que deve estar acontecendo é que a aplicação server não está preparada para esta situação, começa a falar com uma como se fosse a outra e vira bagunça. O server deve tratar o caso de uma das seguintes formas, dependendo dos requisitos do projeto:

  • Controlar corretamente a comunicação com mais de um client
    ou
  • Proibir a conexão quando alguém já estiver conectado.
homisinho

Pessoal, meu servidor so aceita uma conexao por vez!!!
Caso tenha outra maquina rodando a aplicação tudo ocorre certo, a maquina 1 conecta no servidor e a maquina 2 ao criar o socket n recebe resposta e gera uma exception!

Mas tenho esse problema na mesma maquina, na mesma aplicação, terei várias threads tentando comunicar com o servidor!!!

dinunes

Elas usam a mesma porta?

E

homisinho:
Pessoal, meu servidor so aceita uma conexao por vez!!!
Caso tenha outra maquina rodando a aplicação tudo ocorre certo, a maquina 1 conecta no servidor e a maquina 2 ao criar o socket n recebe resposta e gera uma exception!

Mas tenho esse problema na mesma maquina, na mesma aplicação, terei várias threads tentando comunicar com o servidor!!!


Se seu servidor aceitar apenas e tão somente uma conexão por vez (há loucos para tudo) você tem de reduzir um parâmetro que é o parâmetro backlog ( http://download.oracle.com/javase/6/docs/api/java/net/ServerSocket.html#ServerSocket(int,%20int) ou http://download.oracle.com/javase/6/docs/api/java/net/ServerSocket.html#ServerSocket(int,%20int,%20java.net.InetAddress) ). O default é 5 mas você, em tese, poderia abaixá-lo para 1.

É que o backlog é uma fila que permite que vários clientes fiquem “esperando” em uma fila até o servidor conseguir dar outro “accept”. Se o servidor estiver ocupado, em vez de simplesmente recusar a conexão, o cliente espera em uma fila (“backlog”) até ser atendido.

homisinho

Desculpa pela demora na resposta.
Mas na realidade eu tenho várias thread na mesma aplicação comunicando com o mesmo server, ai tinha um problema de concorrência.
O mesmo já foi corrigido e esta funcionando.

Criado 3 de outubro de 2011
Ultima resposta 19 de out. de 2011
Respostas 6
Participantes 4