CHAT REDE EXERNA

HELIO.COSTA 16/02/2017 15:45:44
#471714
Boa tarde a todos,

tenho o código do chat (Rapid_Chat), funcionando na rede local perfeito.
Vb.Net com Windows Form.
Somente Texto.
somente um Cliente e um Servidor.
Quando ping no IP da máquina que estou tentando enviar e receber mensagem externa, pinga normalmente, ,porém, não recebo nem envio nada. Não apresenta erro, simplesmente não envia.

Veja código abaixo.

Imports System.Net.Sockets
Imports System.Threading
Imports System.IO
Imports System.Windows.Forms
Imports System
Imports System.Net.Dns
Imports System.Drawing.Bitmap
Imports UNOLibs.Net.ClientClass
Imports RapChatLib.RapChatLib

Public Class frmServidor
Dim ListenerServer As New TcpListener(9002)
Dim Client As New TcpClient
Dim Message As String = [Ô][Ô]
Dim ListenerServer1 As New TcpListener(9013)
Dim Client1 As New TcpClient
Dim Message1 As String = [Ô][Ô]
Dim IPAdd As String
Dim clnt As New UNOLibs.Net.ClientClass
Dim clnt2 As New UNOLibs.Net.ClientClass

Private Sub frmServidor_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim ListThread As New Thread(New ThreadStart(AddressOf Listening)) [ô]Creates the thread
ListThread.Start() [ô]Starts the thread
End Sub

Private Sub Listening()
ListenerServer.Start()
ListenerServer1.Start()
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If ListenerServer.Pending = True Then
Message = [Ô][Ô]
Client = ListenerServer.AcceptTcpClient()

Dim Reader As New StreamReader(Client.GetStream())
While Reader.Peek > -1
Message = Message + Convert.ToChar(Reader.Read()).ToString
End While
txtRecebe.ForeColor = Drawing.Color.Black [ô]Color.Black
txtRecebe.Text += Message + vbCrLf
End If

If ListenerServer1.Pending = True Then
Message1 = [Ô][Ô]
Client1 = ListenerServer1.AcceptTcpClient()

Dim Reader1 As New StreamReader(Client1.GetStream())
While Reader1.Peek > -1
Message1 = Message1 + Convert.ToChar(Reader1.Read()).ToString
End While
End If
End Sub

Private Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSend.Click
Dim Data As DateTime
Data = DateTime.Now
If txtNome.Text = [Ô][Ô] Or txtIPServidor.Text = [Ô][Ô] Then
MessageBox.Show([Ô]All Fields must be Filled[Ô], [Ô]Error Sending Message[Ô], MessageBoxButtons.OK, MessageBoxIcon.Error)
Else
Try
Client = New TcpClient(txtIPServidor.Text, 9001)

Dim Writer As New StreamWriter(Client.GetStream())
Writer.Write(txtNome.Text + [Ô] : [Ô] + txtmessage.Text + vbCrLf)
Writer.Flush()
txtmessage.Text = [Ô][Ô]
Catch ex As Exception
Console.WriteLine(ex)
Dim Errorresult As String = ex.Message
MessageBox.Show(Errorresult & vbCrLf & vbCrLf & [Ô]Please Review Client Address[Ô], [Ô]Error Sending Message[Ô], MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End If
End Sub

Private Sub btnConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConnect.Click
If txtIPServidor.Text.Length < 4 Then
MessageBox.Show([Ô]Please Enter a Valid Address[Ô], [Ô]Error[Ô], MessageBoxButtons.OK, MessageBoxIcon.Error)
Else
btnConnect.Text = [Ô]Connecting[Ô]
Dim pingresult As String = txtIPServidor.Text [ô][Ô]192.168.1.2[Ô] [ô]My.Computer.Network.Ping(cmbAddress.Text)
If pingresult = [Ô]True[Ô] Then
btnConnect.Text = [Ô]Connected[Ô]
Else
btnConnect.Text = [Ô]Disconnected[Ô]
End If
End If

End Sub

Private Sub btnClear_Click(sender As Object, e As EventArgs) Handles btnClear.Click
txtmessage.Text = [Ô][Ô]
txtRecebe.Text = [Ô][Ô]
End Sub

End Class


KURTGU 16/02/2017 16:47:09
#471715
Fiz um uma vez to procurando aqui pra ver se te envio, ele funcionava via ip externo...
HELIO.COSTA 16/02/2017 16:47:45
#471716
Vai ajudar bastante.
KERPLUNK 16/02/2017 21:31:17
#471727
Resposta escolhida
Tente entender que conexões por sockets, dependem muito mais da estrutura da rede do que de código. Portas e vias devem ser abertas para que tudo flua normalmente e isso nem sempre é algo fácil de ser conseguido, conforme a estrutura de rede em que o usuário está. Por isso, a melhor alternativa para o que você quer é uma WebAPI, porque ela usa a mesma estrutura HTTP já disponível para praticamente todos os usuários.
MESTRE 17/02/2017 09:00:41
#471748
Caso não consiga resolver seu problema não perca tempo reinventando a roda..

Tem um servidor chamado OpenFire (https://www.igniterealtime.org/projects/openfire/) e um Client Chat chamado SPARK (https://www.igniterealtime.org/projects/spark/), é uma solução excelente.. tem até client chat web e registra log, envia arquivos, funciona em localhost más também via web externo se quiser é perfeito só vi vantagens..

Abraços!
HELIO.COSTA 17/02/2017 16:22:43
#471775
Quanto a resposta do KERPLUNK, as portas foram liberadas nas duas máquinas, mas não rodou.

Quanto a resposta do MESTRE, vou verificar estes sites e posto novamente.

Tenho que trabalhar tanto localhost quanto rede externa.

Obrigado.
HELIO.COSTA 17/02/2017 17:48:33
#471779
Estive verificando os links acima e constatei que não é o que preciso. Estes são instaladores e não podem ser comercializado.
algum erro no código acima?
KERPLUNK 19/02/2017 23:41:31
#471807
O código parece ok, o que você não entendeu é que o problema não é o código, mas sim a estrutura do qual ele precisa para rodar apropriadamente. Esse tipo de conexão, funcionaria bem para redes internas, onde o tráfego de rede pode ser controlado de forma muito mais estrita. Quando se trata de expor o serviço para a internet a coisa muda completamente de figura. Não que o código tenha que ser diferente, ele pode ser exatamente o mesmo, mas a estrutura de rede varia de servidor para servidor(leia-se provedor para provedor). São muitos os casos em que portas não usuais são bloqueadas e para liberar essas portas não é nem simples, nem fácil e nem barato. Veja como funciona a maioria dos programas do tipo que você quer, eles não são conexões TCP socket, mas sim fazem uso de WebAPI. O funcionamento é simples, centralizado na WebAPI. Cada usuário faz o login e fica [Ô]visível[Ô] para a WebAPI servir como intermediária da conversa para qualquer outro usuário. é como isso funciona. Você não faz uma conexão direta de máquina à máquina, mas sim conecta em um server que faz o [Ô]meio de campo[Ô]. WebAPI pode transmitir não somente texto, mas dados de qualquer tipo, como imagem, voz, arquivos e até stream em tempo real. A estrutura é simples, utilizando uma via que já está disponível para qualquer usuário que tenha acesso à internet, que é pela porta 80.
Tópico encerrado , respostas não são mais permitidas