Chat para uma rede local. Cliente/Servidor
Olá, estou fazendo um sistema de chat Cliente/Servidor. encontrei um exemplo no marcoratti e estou me baseando nele.
jah fiz a interface e peguei o codigo.
no PC que executo, funciona, mas gostaria que outros PC da rede local conseguissem troicar informações
usa-se sockets e trheads.
vamos la ao codigo...
axo q devo mudar o IP para outra coisa q n seja 127.0.0.1
=/
mas n sei qual. tentei por o IP de onde abro o servidor mas n consigo conectar de outra makina.
cheguei a fazer uma interface q pedia pra entrar com end IP mas n vingou tb.
qual IP devo por.
eis o codigo
SERVIDOR
Imports System.Net.Sockets
Imports System.Text
Imports System.Net
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
CLIENTE
Imports System.Net.Sockets
Imports System.Text
Public Class frmUnirioTalk
Dim clientSocket As New TcpClient()
Dim serverStream As NetworkStream
Dim lerDados As String
Private Sub btnConectar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConectar.Click
Try
lerDados = "Conetado como Servidor ..."
Mensagem()
clientSocket.Connect("127.0.0.1", 8888)
serverStream = clientSocket.GetStream()
Dim outStream As Byte() = Encoding.ASCII.GetBytes(txtNome.Text + "$")
serverStream.Write(outStream, 0, outStream.Length)
serverStream.Flush()
'cria uma nova thread para enviar mensagens
Dim ctThread As Threading.Thread = New Threading.Thread(AddressOf getMensagem)
ctThread.Start()
Me.btnEnviarMensagem.Enabled = True
Catch ex As Exception
MsgBox("servidor nao encontrado")
MsgBox(ex.Message)
End Try
End Sub
Private Sub Mensagem()
If Me.InvokeRequired Then
Me.Invoke(New MethodInvoker(AddressOf Mensagem))
Else
txtDados.Text = txtDados.Text + Environment.NewLine + " >> " + lerDados
End If
End Sub
Private Sub btnEnviarMensagem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEnviarMensagem.Click
Try
Dim outStream As Byte() = Encoding.ASCII.GetBytes(txtMensagem.Text + "$")
serverStream.Write(outStream, 0, outStream.Length)
serverStream.Flush()
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
Private Sub getMensagem()
'loop infinito
While (True)
Try
serverStream = clientSocket.GetStream()
Dim buffSize As Integer
Dim inStream(10024) As Byte
buffSize = clientSocket.ReceiveBufferSize
serverStream.Read(inStream, 0, buffSize)
Dim dadosRetornados As String = Encoding.ASCII.GetString(inStream)
lerDados = "" + dadosRetornados
Mensagem()
Catch ex As Exception
MsgBox(ex.Message)
Exit Sub
End Try
End While
End Sub
Private Sub frmUnirioTalk_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.txtNome.Focus()
btnEnviarMensagem.Enabled = False
End Sub
Private Sub txtMensagem_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtMensagem.KeyPress
If e.KeyChar = Chr(13) Then
Me.btnEnviarMensagem.Focus()
End If
End Sub
Private Sub MenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenToolStripMenuItem.Click
End
End Sub
Private Sub SobreToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SobreToolStripMenuItem.Click
frmsobre.Show()
End Sub
End Class
Discussão (1)
Carregando comentários...