CHAT
O que já tenho em mente para começar o desenvolvimento?
Login, sei que vai ser necessario um login, para diferenciar um usuario do outro.
O que pretendo fazer com o chat?
Poder conversar em grupo e com uma janela nova, conversar em particular individualmente com o usuarios cadastrados.
O que não pode ocorrer?
Conversas de pessoas que não tenha login. Por isso já deixei configurado a primeira tela a de login, antes de abrir qualquer outra janela.
Como montei essa Janela principal apresentado?
Duas textbox com multi-linhas, dois botões simples para enviar e deslogar, Duas label, uma para indicar o Usuario e o Nickname (Codinome) de quem esta logado.
Estou aceitando dicas e sugestões;
- Que plataformas quero atender? Vai ser somente para redes internas ou vai atender qualquer coisa com acesso à internet?
- Terá alguma integração com outros serviços, como Facebook, Google+ ou Twitter?
- Você vai trafegar que tipos de dados, somente texto ou imagens e outros arquivos também?
- Você pensa em arquivar as conversas? Caso sim, onde, no client, no server ou ambos?
Isso pra começar.
Segue um link como eu consegui fazer funcionar...
www.google.com.br/search?q=chat+p2p+vb.net&oq=chat+p2p+vb.net&aqs=chrome..69i57.5560j0j7&sourceid=chrome&ie=UTF-8
Se for feito só para Windows Form, vai fundo no TcpListener e TcpClient. Se não me engano, o Macoratti até uns anos atrás tinha um exemplo de chat nesses moldes, depois dá uma pesquisada.
Agora se for usar outras plataformas, recomendo pesquisar sobre Push Notification... é uma maneira leve de fazer isso. Evitando aquele loop eterno no lado do cliente em busca de informações no servidor e sobrecarregando o coitado. Porque nesse caso, ao invés do cliente ficar verificando no servidor... o servidor notifica o cliente quando tem novas mensagens.
Fazendo toda a estrutura com os métodos de comunicação, o próximo passo é elaborar um padrão do seu texto. Exemplo: Pode colocar tudo em xml, com as tags <tipo_dados> (imagem, texto, etc), <conteudo> (conteudo da informacao)... algo assim.
Lembrando também que deve sempre se preocupar com perdas de informação (problemas de conexão, por exemplo) ... e também ter em mente, que a mensagem chegará dividida em vários pacotes de bytes... São muitos detalhes, qualquer coisa você dá um toque.
Sistemas Operacionais - Windows, Qualquer computador com acesso a internet com Windows, apesar que o CHAT (assim como chamo), será entregue somente para alguns amigos selecionados, a ideia não é comercial nem distribuir para um publico aberto, mas um grupo fechado. Recebi o desafio. A linguagem que pretendo usar, VB.NET com SQL Server (SQL irei usar mais para o Login, para o chat ainda não sei se usarei, como nunca criei um).
- Terá alguma integração com outros serviços, como Facebook, Google+ ou Twitter?
Não, nenhuma relação com nenhuma rede social, será algo bem simples, o mais simples possivel, mais um envio e recebimento de mensagem, para ficar mais claro, estarei postando na resposta seguinte, como ficara a janela do Chat. (Que é o foco que pretendo trabalhar).
- Você vai trafegar que tipos de dados, somente texto ou imagens e outros arquivos também?
Inicialmente, só Texto. Pois meu foco é entender inicialmente como funciona e criar um meu próprio chat e distribuir entre alguns amigos selecionados para poder conversar como um chat convencional.
Talvez seria interessante o envio de um link tipo: [Ô]imagem.jpg[Ô] para que a pessoa possa clicar e baixar a imagem se caso algum usuário queira enviar imagem. Mas só imagem no máximo, não é um item obrigatório inicialmente.
- Você pensa em arquivar as conversas? Caso sim, onde, no client, no server ou ambos?
As conversas estou analisando o custo/beneficio, estou procurando algum servidor gratuito para fazer isso, mas inicialmente nos clientes serão salvas as conversas, como o CHAT é capaz de juntar varias pessoas em um único ambiente. Estou pensando seriamente também em não salvar, assim que a pessoa entrar no CHAT, começar a acompanhar a conversa a partir daquele momento.
No caso a variável enderecoLocal está dando erro, Dim enderecoLocal As IPAddress = IPAddress.Parse([Ô]127.0.0.1[Ô]) a parte sublinhada diz que o IPAddress não está definido. Simplesmente fiz a leitura, digitei de acordo com o modulo do site, mas apareceu isso.
Obs: Só fiz o Modulo1 até agora.
Citação:
Imports System.Net.Sockets
Imports System.Text
Module Module1
Dim listaClientes As New Hashtable
Sub Main()
Dim enderecoLocal As IPAddress = IPAddress.Parse([Ô]127.0.0.1[Ô])
Dim serverSocket As New TcpListener(enderecoLocal, 8888)
Dim clientSocket As TcpClient = Nothing
Dim contador As Integer
serverSocket.Start()
Mensagem([Ô]Servidor Chat Iniciado ...[Ô])
contador = 0
While (True)
contador += 1
clientSocket = serverSocket.AcceptTcpClient()
Dim bytesFrom(10024) As Byte
Dim dadosDoCliente As String
Dim networkStream As NetworkStream = clientSocket.GetStream()
networkStream.Read(bytesFrom, 0, CInt(clientSocket.ReceiveBufferSize))
dadosDoCliente = Encoding.ASCII.GetString(bytesFrom)
dadosDoCliente = dadosDoCliente.Substring(0, dadosDoCliente.IndexOf([Ô]$[Ô]))
listaClientes(dadosDoCliente) = clientSocket
broadcast(dadosDoCliente + [Ô] Entrou [Ô], dadosDoCliente, False)
Mensagem(dadosDoCliente + [Ô] Entrou na Sala [Ô])
Dim cliente As New tratarCliente
cliente.iniciaCliente(clientSocket, dadosDoCliente, listaClientes)
End While
clientSocket.Close()
serverSocket.Stop()
Mensagem([Ô]sair[Ô])
Console.ReadLine()
End Sub
Sub Mensagem(ByVal texto As String)
texto.Trim()
Console.WriteLine([Ô] >> [Ô] + texto)
End Sub
Private Sub broadcast(ByVal Mensagem As String, ByVal nomeUsuario As String, ByVal flag As Boolean)
Dim Item As DictionaryEntry
For Each Item In listaClientes
Dim broadcastSocket As TcpClient
broadcastSocket = CType(Item.Value, TcpClient)
Try
Dim broadcastStream As NetworkStream = broadcastSocket.GetStream()
Dim broadcastBytes As [Byte]()
If flag = True Then
broadcastBytes = Encoding.ASCII.GetBytes(nomeUsuario + [Ô] diz : [Ô] + Mensagem)
Else
broadcastBytes = Encoding.ASCII.GetBytes(Mensagem)
End If
broadcastStream.Write(broadcastBytes, 0, broadcastBytes.Length)
broadcastStream.Flush()
Catch ex As Exception
MsgBox(ex.Message)
End Try
Next
End Sub
Public Class tratarCliente
Dim clientSocket As TcpClient
Dim clNo As String
Dim listaClientes As Hashtable
Public Sub iniciaCliente(ByVal inClientSocket As TcpClient, ByVal clineNo As String, ByVal cList As Hashtable)
Me.clientSocket = inClientSocket
Me.clNo = clineNo
Me.listaClientes = cList
Dim ctThread As Threading.Thread = New Threading.Thread(AddressOf doChat)
ctThread.Start()
End Sub
Private Sub doChat()
Dim contadorRequisicao As Integer
Dim bytesFrom(10024) As Byte
Dim dadosDoCliente As String
Dim rContador As String
contadorRequisicao = 0
While (True)
Try
contadorRequisicao = contadorRequisicao + 1
Dim networkStream As NetworkStream = clientSocket.GetStream()
networkStream.Read(bytesFrom, 0, CInt(clientSocket.ReceiveBufferSize))
dadosDoCliente = System.Text.Encoding.ASCII.GetString(bytesFrom)
dadosDoCliente = dadosDoCliente.Substring(0, dadosDoCliente.IndexOf([Ô]$[Ô]))
Mensagem([Ô]Cliente - [Ô] + clNo + [Ô] : [Ô] + dadosDoCliente)
rContador = Convert.ToString(contadorRequisicao)
broadcast(dadosDoCliente, clNo, True)
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End While
End Sub
End Class
End Module