Rafa 1850 0 Denunciar post Postado Novembro 24, 2009 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 Compartilhar este post Link para o post Compartilhar em outros sites
VictorWentz 0 Denunciar post Postado Novembro 27, 2009 Primeiro, tome cuidado com o firewall. Depois, no servidor, altere a seguinte linha: Dim enderecoLocal As IPAddress = IPAddress.Parse("127.0.0.1") para Dim hostName As String = Dns.GetHostName() Dim enderecoLocal As IPAddress = Dns.Resolve(hostName).AddressList(0) Após isso, você vai precisar saber o endereço ip do computador servidor, e substituir o "127.0.0.1" por tal endereço IP. clientSocket.Connect("127.0.0.1", 8888) ' Para clientSocket.Connect(ENDEREÇO IP DO COMPUTADOR SERVIDOR, 8888) Espero que isso ajude, Conte-nos os resultados. Victor Compartilhar este post Link para o post Compartilhar em outros sites