Socket

ae galera,

estou fazendo um jogo d ateh 4 pessoas, o servidor tem 4 instancias de uma thread e cada uma fica dando um socket = serverScoket.accept();
depois de conectado, ele passa dakela linha e cai num while(true) com um in.readUTF, certo? certo!
entao quando eu tiver 4 clientes conectados, o servidor nao tera mais socket = serverScoket.accept();, certo? certo!

o problema eh q mesmo com os 4 clientes conectados eu acinda consigo “conectar” mais um cliente, ou melhor dizendo, parece q ele fica numa fila, e c eu desconecto um cliente, dai sim ele conecta de verdade, eu gostaria de dar uma msg de erro pra ele, mas como?

obrigado!

O server socket aceita a conexao e coloca em um socket certo? certo!

Entao, quando vc tenta mais um, ele aceita e coloca em um novo socket.

Tudo depende de como vc implementou. Se puder postar o trecho do codigo ajuda.

Abraço

[edit]

Na verdade eh ateh desnecessario ter 4 servers sockets na maioria dos casos… um jah da, e coloca o q receber pra ser atendido por um socket.

[/edit]

Você precisa de uma única thread, com o ServerSocket.accept(). Depois de recebida a conexão você pega o socket que ele te retornou e dispara outra thread, para lidar com essa conexão fechada.

Só mantenha esse accept num while(). Um pseudo código seria esse:

numConexoes = 0;
while (numConexoes < 4) {
    Socket cliente = server.accept();
    Thread t = new Thread(new ClienteRunnable(cliente));
    t.start();
    numConexoes++;
}

nao posso ter 1 thread, pois sao 4 clientes…

o código ta muito grande e não vai ficar bom por aki, mas simplificando:

metodo run da thread()
{
socket1 = serverSocket.accept();

in1 = new DataInputStream…
out1 = new DataOutputStream…

while(true)
{
String s = in1.readUTF();
}
}

4 instancias iguais, porem com o numero certo da thread, por exemplo:
socket1 = serverSocket.accept();
socket2 = serverSocket.accept();
socket3 = serverSocket.accept();
socket4 = serverSocket.accept();

in1, in2, in3, in4

etc…

quando todos estao conectados, nao existe mais serverSocket.accept, pois ai as 4 threads entraram no while(true)

mesmo assim, quando conecto um quinto cliente, ele parece q fica numa fila…

este eh o problema… nao pode ficar numa fila, kero q de erro!

obrigado

Leia direito o que eu escrevi.

Eu falei para você ter uma única thread para receber as conexões.
Não para ter uma única thread para tratar os seus clientes.

Se você tiver 4 SocketServers, terá que abrir 4 portas na sua aplicação. Já viu algum servidor que exige que você abra uma porta para cada cliente?
Simplesmente não é assim que se faz.

vc cria uma thread para receber a conexao, e 4 para tratar…

quando receber uma conexao, poe em uma q trate e vlta a ouvir…

se nao tiver nenhuma para tratar disponivel, envia a mensagem de erro para quem tentou conectar…

[quote=ViniGodoy]Leia direito o que eu escrevi.

Eu falei para você ter uma única thread para receber as conexões.
Não para ter uma única thread para tratar os seus clientes.

Se você tiver 4 SocketServers, terá que abrir 4 portas na sua aplicação. Já viu algum servidor que exige que você abra uma porta para cada cliente?
Simplesmente não é assim que se faz.[/quote]

desculpa vini, mas vc que nao leu direito o que escrevi, tenho 1 serverSocket.accept(), retornando para 4 diferentes variaveis:

socket1 = serverSocket.accept();
socket2 = serverSocket.accept();
socket3 = serverSocket.accept();
socket4 = serverSocket.accept();

cada 1 dentro de uma thread diferente… saka?

assim terei 4 sockets, destes 4 sockets eu tirarei 2 canais de comunicação de cada 1, IN e OUT

abraço, obrigado

[quote=paulohrl]vc cria uma thread para receber a conexao, e 4 para tratar…

quando receber uma conexao, poe em uma q trate e vlta a ouvir…

se nao tiver nenhuma para tratar disponivel, envia a mensagem de erro para quem tentou conectar…[/quote]

para eu enviar uma msg d erro pra quem ta tentando conectar, eu preciso do socket dela, e do respectivo OUT, porem todos os serverSocket.accept() ja foram utilizados, isto é, nao tem mais como pegar o socket do quianto cara, muito menos o OUT…

e mesmo sem nenhum accept no servidor, o quinto cliente conecta, incrivel!!!

obrigado

rs

cria um 5º socket soh pra receber, dar a mensagem de erro e pronto rs…

[quote=paulohrl]rs

cria um 5º socket soh pra receber, dar a mensagem de erro e pronto rs…[/quote]

eh uma solução, tbm tinha pensado nisso, mas… :stuck_out_tongue:
prefiro saber c vcs tem alguma ideia do tipo, setar maximo de conexao no serverSocket e talz…

valew

cria um contador… depois q ele aceitar a quarta conexao vc tira ele do loop q da o accept

[quote=paulohrl]cria um contador… depois q ele aceitar a quarta conexao vc tira ele do loop q da o accept
[/quote]

ai eh q ta, após 4 conexoes, nao existe mais serverSocket.accept();

nao consigo imaginar como o cliente ta conseguindo conectar…

abraço

cara, sem ver m trecho do codigo nao da pra imaginar o q ta acontecendo nao