Ir para conteúdo
Fórum Script Brasil
  • 0

Chat Em único Aplicativo


Denis_Rave

Pergunta

Olá galera!

Bom, muito já se falou aqui no fórum (e na web também) sobre criação de chats e todas as coisas do tipo.

Porém, até hoje, sempre encontrei soluções relacionadas ao desenvolvimento de duas aplicações em separado: Cliente e Servidor.

Gostaria de saber se é possível combinar as duas aplicações em apenas uma, porém, sem ter de nesta aplicação ficar escolhendo entre Cliente e Servidor. Por exemplo, uma única aplicação que recebesse e enviasse mensagens para outros usuários do programa.

Abraços

Editado por Denis_Rave
Link para o comentário
Compartilhar em outros sites

18 respostass a esta questão

Posts Recomendados

  • 0

"Cliente" e "servidor" são apenas termos utilizados para indicar a direção da *conexão*. Alguém sempre vai ter que estar esperando (servidor) e alguém vai sempre vai tentar conectar (cliente). Uma vez conectados não há diferença entre cliente e servidor, ambos enviam e ambos recebem. Você achava que só o cliente enviava e só o servidor recebia?

Seu programa de chat pode ter os dois comportamentos naturalmente. Ele pode esperar e pode efetuar conexões. E uma vez conectado com outro computador não importa se ele foi o "servidor" ou o "cliente".

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Opa Graymalkin

Não, eu já entendia que ambos podiam enviar e receber dados ^^

Quando me referi a "cliente" e "servidor" foi porque eu só encontrei exemplos de chats em duas aplicações distintas

Só estou com problemas é em como desenvolver a comunicação de um pc com dois ou mais

No caso, eu terei de ir desconectando e reconectando em seguida para cada cliente que eu desejar enviar a mensagem?

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Não, você vai ficar conectado com todos eles ao simultaneamente e vai poder enviar para todos eles. No caso, cada um vai ter um socket próprio. O ideal neste caso é usar um array de Winsocks. Coloque um no controle Winsock no form e coloque 0 na sua propriedade Index. Com isso você estará tornando este controle um vetor (array). Daí, você poderá fazer o seguinte para criar um novo winsock via código:

Load Winsock(x)

Onde "x" é o identificador numérico que vai representar aquele socket.

Então, a idéia é criar um socket novo para cada cliente que se conectar e ao aceitar a conexão (no evento ConnectionRequest) você vai aceitá-lo novo socket criado. Ou seja, Winsock(0) vai sempre estar esperando por uma conexão, e quando esta chegar ela vai ser aceita pelos demais (Winsock(1), Winsock(2), Winsock(3), ..., Winsock(n)).

Está é basicamente a idéia, e é claro que haverão alguns detalhes de implementação que você provavelmente deparar-se-á.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Hmmmm

Eu vi a discussão de alguns problemas gerados por esse tipo de implementação em um outro tópico aqui no fórum.

Certo, mas por exemplo...Meu aplicativo, toda vez que for iniciado, precisa receber uma "lista" de todos os pcs da rede que estão executando o programa (no caso, eu enviaria um por um) para que ele soubesse com que máquinas é possível realizar uma comunicação. Porém, me deparei num beco sem saída xD, já que quando o programa inicia não possui essa lista de computadores, ou seja, não é possível conectá-lo com outro pc pra receber a lista. não sei se você me entendeu...

Tem alguma idéia de como eu poderia resolver esse problema?

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

De fato, você precisa dos endereços IP dos outros computadores disponíveis. Em uma rede local isso não é problema, já que você pode configurar os IPs manualmente e assim você saberá o IP de cada um; ou você pode usar um servidor DHCP e simplesmente varrer uma determinada faixa de IP procurando quem está disponível (já que você terá absoluta certeza de que todos os computadores da rede estarão nesta faixa).

Todavia, se você pretende utilizar esse programa via Internet então nenhuma das opções acima é viável. Neste caso, ou você teria que ter um computador com IP fixo que mantivesse a lista (atuando como um servidor), ou uma solução melhor seria utilizar um serviço como o NO-IP que lhe permite atribuir um nome (meucomputador.no-ip.org) a um determinado IP e que é atualizado automaticamente quando este muda. Neste caso você também poderia utilizá-lo como um servidor para fornecer uma lista atualizada de computadores disponíveis para utilização com o seu programa.

Certo? ;)

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Sim sim...eu conheço todos os IP's que são usados na rede, na verdade eu até conheço todos os nomes das máquinas da rede.

Só não faço idéia de como eu posso varrer a rede atrás dos computadores que estão disponíveis...será que poderia me dar uma luz?

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Se por exemplo a sua classe de IP é a C, você vai tentar conectar de 192.168.0.1 até 192.168.0.255. Como ele só vai conseguir conectar aos que estiverem on-line e com o seu programa rodando, você a partir disso tem como saber quais são os disponíveis.

Talvez também realizar um net view para ver quais os computadores existentes na rede também seria uma alternativa (talvez mais rápida do que tentar um por um).

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Pois é...eu tava pensando justamente no desempenho do programa...

porque testar 256 conexões...acredito que levaria um tempinho até realizar todas as conexoes não?

Com relação ao net view, seria uma boa solução eu executar esse comando, mandando o resultado pra um arquivo .txt e depois ler este arquivo atrás das máquinas disponíveis?

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Pois é...eu tava pensando justamente no desempenho do programa...

porque testar 256 conexões...acredito que levaria um tempinho até realizar todas as conexoes não?

Na verdade são só 254 possibilidades (0 é para a máscara e 255 para broadcast), mas sim, certamente levaria um tempinho bom.

Com relação ao net view, seria uma boa solução eu executar esse comando, mandando o resultado pra um arquivo .txt e depois ler este arquivo atrás das máquinas disponíveis?

O ideal mesmo seria utilizar uma alternativa mais nativa para receber os computadores da rede, mas desconheço se existe alguma função da API Win32 específica para isso.

Então, acho que esse "quebra-galho" de gravar o resultado do net view em um arquivo texto seria o mais utilizável no caso.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado Graymalkin.

Realizei alguns testes na rede e acabei tendo a desagradável supresa de que o comando "net view" está desabilitado.

Acredito então que não vou ter outra solução a não ser checar todas as conexões.

Por sorte conferi que são menos de 100 conexões, o que vai aliviar um pouco. Caso eu tenha novas dúvidas volto a entrar em contato

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Então, talvez fosse mais simples você ter uma máquina central que estaria mantendo uma lista dos computadores disponíveis. Esta teria um endereço fixo e assim cada cliente que estivesse on-line iria notificá-la. E todos os clientes poderiam requisitar dela uma lista dos outros clientes disponíveis.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Pois então,

Eu já tinha pensando em fazer isso...mas seria dificil pois eu não tenho total acesso a rede e seria complicado manter um máquina sempre rodando um aplicativo para enviar os clientes online.

Além do mais, a idéia do meu chat seria de cada aplicativo funcionar ao mesmo tempo como servidor e cliente.

Mas tive uma idéia: O que você acha de quando o programa estabelecer a primeira conexão, ao invés de continuar fazendo mais conexões, pedir a este cliente que ele acabou de conectar a lista de usuários??

Abraços

Editado por Denis_Rave
Link para o comentário
Compartilhar em outros sites

  • 0

Sim, eu sugerir justamente isso. É exatamente esta a idéia de um protocolo que estou desenvolvendo para um P2P (tipo eMule) só que sem servidor. No caso, todos os clientes possuem listas mais-ou-menos atualizadas e a medida que novos clientes vão sendo inter-conectados eles passam adiante esta informação para seus próprios clientes.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Legal...tou implementando essa idéia no projeto, espero que dê certo

Aproveitando, quero tirar uma dúvida...é possível acontecer conflitos se eu usar componentes de versoes diferentes? Por exemplo, aqui em casa tou desenvolvendo com a OCX do Winsock do SP6 do VB...pode acontecer alguma anomalia se eu executar o aplicativo numa máquina com uma OCX mais antiga?

Ou, muito interessante você desenvolver um software P2P...já usei alguns dos seus aplicativos e gostei pra caramba. Se precisar de alguém para testar esse P2P pode contar comigo \o

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Legal...tou implementando essa idéia no projeto, espero que dê certo

Aproveitando, quero tirar uma dúvida...é possível acontecer conflitos se eu usar componentes de versoes diferentes? Por exemplo, aqui em casa tou desenvolvendo com a OCX do Winsock do SP6 do VB...pode acontecer alguma anomalia se eu executar o aplicativo numa máquina com uma OCX mais antiga?

Sim, pode acontecer sim. Se não me engano eu mesmo já tive esse problema. Mas, no caso, é só você incluir o OCX no seu programa de instalação. Isso resolve o caso.

Ou, muito interessante você desenvolver um software P2P...já usei alguns dos seus aplicativos e gostei pra caramba. Se precisar de alguém para testar esse P2P pode contar comigo \o

Bom, o desenvolvimento tá meio parado por falta de tempo, mas pode deixar que quando estiver em fase de teste eu te aviso! Valeu! :)

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Bom, acredito que seja esse a causa dos problemas do meu aplicativo...porque eu faço testes aqui em casa usando meu Windows XP e duas máquinas virtuais Windows 98...ai chega na rede que eu tenho de testar, sempre dá erro. Só que lá é Windows 2000. Talvez seja por causa disso.

Aproveitando o assunto, você sabe o que pode causar o fechamento do VB no Windows 2000 sem mais nem menos? porque toda vez que eu vou adicionar um componente no projeto ele fecha o VB sozinho...

Bom, o desenvolvimento tá meio parado por falta de tempo, mas pode deixar que quando estiver em fase de teste eu te aviso! Valeu! :)

Tempo hoje em dia é um grande problema...mas a gente sempre consegue xD...Mas pode contar comigo ^^

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Bom

Estou revivendo o tópico xD, mas é porque ainda encontrei alguns problemas...

Estava implementando a rotina que vai varrer a rede procurando as máquinas com o programa aberto, porém me deparei com um erro.

Segue a rotina:

Dim i As Integer
For i = 1 To 100
    WskSalas.RemoteHost = "xxx.xxx.xxx." & (i + 100)
    WskSalas.Connect
    DoEvents: DoEvents: DoEvents: DoEvents
    If WskSalas.State = 7 Then
        lstSalas.AddItem ("xxx.xxx.xxx." & (i + 100))
    End If
    WskSalas.Close
    DoEvents: DoEvents: DoEvents: DoEvents
Next

O erro que me é retornado é 10055 "No buffer space is available", exatamente na linha WskSalas.Connect

O que é estranho é que o erro ocorre aleatoriamente. Por exemplo, em certo momento ele ocorre quando o i está em 10, se eu rodar de novo ele retorna o erro para i = 30, mesmo a 10ª máquina estando desligada as duas vezes em que executei o programa.

Não acredito que o problema esteja quando eu defino o RemoteHost, porque já fiz com um array de máquinas e obtive o mesmo erro

Que será que está errado?

Abraços

Editado por Denis_Rave
Link para o comentário
Compartilhar em outros sites

  • 0

Bom, eu nunca tinha visto este erro antes. Então, fiz uma busca no Google que me revelou os seguintes links:

http://www.qksoft.com/qk-smtp-server/socket-error-10055.html

http://kbase.pscs.co.uk/index.php?article=93

http://forums.globalscape.com/tm.aspx?m=3017

Dê uma lida particularmente no último, onde o caboclo achou uma solução para o problema no caso dele.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...