Socket multithreaded

Pessoal,

Estava analisando alguns exemplos na internet sobre servers (socket) multithreaded. Percebi que todos utilizam de um while (true) para que o server fique aguardando alguma conexão (conforme esse exemplo: http://javafree.uol.com.br/topic-8536-ServerSocket-e-Socket-duvida-Servico.html).

Existe uma forma de fazer esse server ficar aguardando conexões sem usar esse while (true) (no exemplo como while (! done))??

Alguém tem alguma idéia ou já fez isso?

Obrigada.

Não precisa ser o valor true, mas você pode criar uma variável para manter seu server ativo, e quando quiser terminar, é só alterar para false

while (activeServer){
...

É exatamente esse while que eu queria eliminar, pois não acho uma boa prática. Só queria saber se existe outra forma.

Obrigada!

Mania de acharem que while não é boa prática. Só por que é uma estrutura básica.

Daí pegam e trocam por um timer que no fim das contas faz a mesma coisa e
gastam mais recursos.

Por que acham que ainda se lê arquivos com readLine???
Por que há interação do programa com a parte física e nessas horas a parte
física não dispara eventos.

O while fica repetindo a checagem da porta, é pra isso que ele existe.

Você está interagindo com a parte física, não existe evento “A porta recebeu”, então
que se pode fazer e ficar lendo ela para ver se recebeu algo.

E a forma mais simples é a mais correta, sempre…

[quote=dalilaserpa]Pessoal,

Estava analisando alguns exemplos na internet sobre servers (socket) multithreaded. Percebi que todos utilizam de um while (true) para que o server fique aguardando alguma conexão (conforme esse exemplo: http://javafree.uol.com.br/topic-8536-ServerSocket-e-Socket-duvida-Servico.html).
Existe uma forma de fazer esse server ficar aguardando conexões sem usar esse while (true) (no exemplo como while (! done))??
Alguém tem alguma idéia ou já fez isso?

Obrigada.[/quote]

Acho q não …não tem um Listener de conexão!! Por isso o while.
Não vejo problema nenhum…é só colocar numa thread separada…

[quote=dalilaserpa]É exatamente esse while que eu queria eliminar, pois não acho uma boa prática. Só queria saber se existe outra forma.
Obrigada![/quote]
Quais são os contras?

Bom, não precisam ficar bravos…hauhauhauha…

Nada contra while. Sei que é uma estrutura básica. Mas, acham que while (true) é uma boa prática?

Ah e essa de colocar uma variavel booleana lá não muda muita coisa, afinal ela será “setada” como true, praticamente dá na mesma.

Acho que o Java é uma grande linguagem e usar esse while (true) é muito primitivo. Mas, caso não tenha outro jeito, fazer o que…

Já testei alguns frameworks orientados a eventos, mas são muito chatos de trabalhar com eles.

Bom, se alguem tiver algo que realmente acrescente e que seja conivente com minha pergunta, agradeço.

Obrigada!

Não consigo ver melhor forma do que essa. Creio que não há necessidade de querer complicar o que já nasceu para ser fácil :slight_smile:

Se while não fosse um boa pratica não estaria no Java como aconteceu com ponteiros , herança multipla etc…
Outra coisa, while é uma instrução de repetição básica…não entra como “boa pratica”.
Qual linguagem que retirou a semantica do while por ser uma pratica ruim? kkkkk

[quote]Acho que o Java é uma grande linguagem e usar esse while (true) é muito primitivo. Mas, caso não tenha outro jeito, fazer o que…
[/quote]
Não acho isso, em Java temos um comando BREAK q interrompe a instrução do while…é muito normal usar while(true) que sintaticamente e semanticamente dizendo expressa um bloco repetição infinito. Diante disso, vc pode usar o break dentro de um logica complexa para estabelecer um critério de interrupção do loop.
Talvez vc poderia ter falado levantado a situação de forma diferente…com algo assim:
“Por que Java não tem um comando q expresse nativamente um bloco de codigo loop infinito ?”
“Por que na linguagem TAL tem um comando assim, assado” Vc sabe de alguma???
Quero te dizer que existe o JCP para vc votar nas novas coisas do java…fique a vontade para fazer um pedido de JSR.

[quote]Se while não fosse um boa pratica não estaria no Java como aconteceu com ponteiros , herança multipla etc…
Outra coisa, while é uma instrução de repetição básica…não entra como “boa pratica”.
Qual linguagem que retirou a semantica do while por ser uma pratica ruim? kkkkk [/quote]

Ela não falou do while ser uma má prática. Ela estava falando explicitamente de não colocar uma condição de parada no while.

Aliás, eu também não considero o

while (true)

a melhor das práticas.

Você é obrigado a procurar a condição de parada do while no meio do código. Se o while for muito curtinho, até vá lá.
Mas prefiro deixar as coisas mais explícitas.

Lembrando que como um server socket é tipicamente um sistema multi-thread, essa variável boolean ou terá que ser declarada como volatile, ou terá que ser acessada através da chamada de um método sincronizado.

Eu custei a acreditar que vocês programadores em sã consciência estavam a defender o uso do while (true).

Bom, Vini, obrigada pela dica. Estou tentando implementar da melhor maneira possível.

Obrigada!

Ainda não vi argumentos reais e claros q afirmem isso…q por enquanto, para mim é apenas uma opinião particular…
Vc’s tem a liberdade de tentar me convencer…kkkkkkk

[quote=dalilaserpa].
Ah e essa de colocar uma variavel booleana lá não muda muita coisa, afinal ela será “setada” como true, praticamente dá na mesma.
[/quote]

Só complementando a discussão, há muita diferença em usar uma variável, desta forma você pode definir quando o servidor deve parar de escutar novas conexões.