| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/10/2003 11:34:25
|
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.
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/10/2003 13:01:18
|
kuchma
Moderador
![[Avatar]](/images/avatar/85422afb467e9456013a2a51d4dff702.jpg)
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. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/10/2003 13:32:45
|
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/10/2003 17:07:56
|
kuchma
Moderador
![[Avatar]](/images/avatar/85422afb467e9456013a2a51d4dff702.jpg)
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. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 25/10/2003 13:39:18
|
louds
Moderador
![[Avatar]](/images/avatar/1e48c4420b7073bc11916c6c1de226bb.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/10/2003 09:21:56
|
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!
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/10/2003 12:49:03
|
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/10/2003 14:18:56
|
louds
Moderador
![[Avatar]](/images/avatar/1e48c4420b7073bc11916c6c1de226bb.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/10/2003 15:32:02
|
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/01/2011 13:05:04
|
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:
|
|
|
 |
|
|