Multithreaded Server  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
Filipe Sabella
GUJ Expert

Membro desde: 12/03/2003 11:25:57
Mensagens: 4680
Offline

Oi, boa tarde.

Situação: há um server, que controla todas as conexões dos clients, cada client reside em um thread do server.

Até aqui ótimo.

Mas a dúvida é: Ao receber uma mensagem de um client (que reside num thread) como fazer para o server enviar esta mensagem para os outros client (que estão em outro threads)?

Agradetados adiancimentos.
[ICQ]
kuchma
Moderador
[Avatar]

Membro desde: 17/01/2003 19:36:16
Mensagens: 1231
Localização: Curitiba - PR
Offline

LIPE wrote:Situação: há um server, que controla todas as conexões dos clients, cada client reside em um thread do server.

Até aqui ótimo.

Mas a dúvida é: Ao receber uma mensagem de um client (que reside num thread) como fazer para o server enviar esta mensagem para os outros client (que estão em outro threads)?


Uma ideia:

Quando o cara se conectar voce joga a thread dele e um identificador (pode ser o IP p.ex.) numa colecao. Em cada mensagem voce envia o identificador do destinatario. Quando o servidor receber uma mensagem voce pega o identificador, resgata a thread do destinatario e dispara a mensagem para ele.

Estou imaginando que essa "thread" que voce mencionou seja um objeto com o qual voce consiga se comunicar com o cliente, certo?

Depois diz pra gente se esse barato funcionou... Voce ta fazendo um chat? Tenho interesse nesse assunto.


Marcio Kuchma

E tu, Belém-Efrata, pequena demais para figurar como grupo de milhares de Judá, de ti me sairá o que há de reinar em Israel, e cujas origens são desde os tempos antigos, desde os dias da eternidade. Mq 5:2, Miquéias, 750 AC aprox.
[WWW] [ICQ]
Filipe Sabella
GUJ Expert

Membro desde: 12/03/2003 11:25:57
Mensagens: 4680
Offline

Então cara, o problema é anterior a esse que você já ajudou a solucionar hehe ainda não preciso selecionar qual client receber qual mensagem. Apenas mandar a mensagem para todo mundo hehe

Aqui está o código do server:



Entendeu o que quis dizer com Thread? Então, cada client que se conecta, o server cria um thread para lidar com cada um deles.

Isso faz com que a comunicação client x server seja perfeita, mas a comunicação server x clientS (plural) não existe.

A minha dúvida é como fazer o server mandar um broadcast para todos os clients.
[ICQ]
kuchma
Moderador
[Avatar]

Membro desde: 17/01/2003 19:36:16
Mensagens: 1231
Localização: Curitiba - PR
Offline

LIPE wrote:Isso faz com que a comunicação client x server seja perfeita, mas a comunicação server x clientS (plural) não existe.

A minha dúvida é como fazer o server mandar um broadcast para todos os clients.


Hmmm, saquei o problema.

Bom, vou ser sincero - (ainda) nao li teu codigo inteiro.

Mas pela tua duvida (melhor coisa que tem eh quando a gente consegue definir nossa duvida em poucas e claras palavras ) eu posso sugerir duas coisas:

- Veja como funciona a classe DatagramSocket e como acopla-la num endereco de multicast (um endereco de multicast eh igual um endereco comum, mas ele fica numa faixa especial - de 244.0.0.0 ate 239.255.255.255 acho). Dessa maneira voce conseguiria disparar mensagens para um endereco de multicast e todos que estivessem "ouvindo" neste endereco receberiam as mensagens. Mas nao sei como isso se encaixa no seu projeto atual - sockets de datagramas sao diferentes de stream sockets.

- Outra maneira mais "tosca" seria voce percorrer sua colecao que armazenam os sockets dos clientes e enviar a mensagem para cada um individualmente. Ta, eu sei que isso nao eh broadcast, mas pode ser uma opcao.

Estou trabalhando num projeto semelhante ao teu... comente teus progressos em fazer o broadcast.


Marcio Kuchma

E tu, Belém-Efrata, pequena demais para figurar como grupo de milhares de Judá, de ti me sairá o que há de reinar em Israel, e cujas origens são desde os tempos antigos, desde os dias da eternidade. Mq 5:2, Miquéias, 750 AC aprox.
[WWW] [ICQ]
louds
Moderador
[Avatar]

Membro desde: 29/04/2003 23:09:15
Mensagens: 4061
Localização: São Paulo
Offline

Crie 1 fila de mensagens por cliente conectado e coloque cada thread consumindo da sua fila e produzindo para as demais.

algo +/- assim:



Coisa simples ate aqui ne?
Ok, agora voce cria 1 class que faz a multiplexagem das mensagens:



Esse cara pega e distribui 1 objeto vindo 1 uma fila para todas as demais.
E como voce usa isso? No loop das tuas thread que ficam lendo a entrada faça assim:




http://www.kumpera.net/blog/
http://www.mono-project.com/
"Each individual should work for himself. People will not sacrifice themselves for the company. They come to work at the company to enjoy themselves."
Soichiro Honda
[ICQ]
Filipe Sabella
GUJ Expert

Membro desde: 12/03/2003 11:25:57
Mensagens: 4680
Offline

kuchma - valeu mesmo, e pelo que andei pesquisando datagramSocket é realmente mais utilizado para este tipo de coisa, mas trabalhar com UDP me dá nos nervos hehe
Pode deixar que meu progresso deixará uma trilha de posts aqui

Louds - muitissimo obrigado por responder, vou estudar melhor o código que você postou, pois admito ainda não conhecer alguns conceitos que você usou. Mas o jeito que você fez realmente me parece oferecer mais controle sobre as mensagens. Valeu!
[ICQ]
Filipe Sabella
GUJ Expert

Membro desde: 12/03/2003 11:25:57
Mensagens: 4680
Offline

Louds ... não sei como te dizer isso mas ... não rolou hehe mas vou continuar nesse caminho.

ps.: sim, eu arrumei os errinhos de digitação.
[ICQ]
louds
Moderador
[Avatar]

Membro desde: 29/04/2003 23:09:15
Mensagens: 4061
Localização: São Paulo
Offline

cara, eu não testei esse código e te digo que ele tem grande problema.
Sockets no java são blocantes, ou seja, eles ficam parados enquanto não aparecer dados para serem lidos.

E isso vai fazer meu exemplo não funcionar, já que as mensagens da fila serão somente transmitidas para o cliente quando ele mandar algo pro servidor.

Exsitem algumas formas de resolver isso:

-Use o método available() antes de read() para verificar se existem dados disponiveis para leitura no socket.
-Usar read() com timeout pequeno.
-Usar sockets não-blocantes e read() pooling
-Usar sockets não-blocantes e io multiplexing (via select)

Minha sugestão é você tentar com os 2 primeiros que são beem mais simples

http://www.kumpera.net/blog/
http://www.mono-project.com/
"Each individual should work for himself. People will not sacrifice themselves for the company. They come to work at the company to enjoy themselves."
Soichiro Honda
[ICQ]
Filipe Sabella
GUJ Expert

Membro desde: 12/03/2003 11:25:57
Mensagens: 4680
Offline

Não expliquei direito quando disse que não rolou. O server manda a mensagem para o cliente, mas para 1 cliente apenas (aquele que mandou a mensagem).

Pelo fato do método dequeue ser synchonized, ele não garantiria que a ação seria realizada por todos os threads?

E, pelo que entendi, a mágica toda de mandar a mensagem para todos os clients acontece aqui, não é?



Valeu pelas dicas cara vou pesquisar.
[ICQ]
farelogost
JavaBaby

Membro desde: 13/01/2011 14:59:45
Mensagens: 83
Offline

bom krinha
se vc ainda tiver duvida em relacao a isso
eu achei um negocio que pdoe te esclarecer


cliente:
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team