Я пытаюсь создать базовую программу сервера-клиента чата, используя TCP / IP и переадресацию портов в VB.NET. Код почти полностью взят из учебников Карло де Сильвы YouTube . У меня постоянно возникают проблемы с подключением двух клиентов. Когда я открываю клиент на моем компьютере и другой клиент на другом компьютере, я получаю сообщение об ошибке «Попытка подключения не удалась, потому что подключенная сторона не ответила должным образом через определенный промежуток времени, или не удалось установить соединение, поскольку подключенный хост не смог ответить [ф]: 5757"
Существуют три разные программы: сервер, клиент и клиент на другом конце (друг-клиент). Сервер и клиент используют мой локальный IP-адрес, к которому осуществляется программный доступ, поэтому он не может быть из-за опечатки. Друг клиента использует мой внешний IP-адрес, который я проверил на сегодня (2018-09-09), и это правильно. Я настроил переадресацию портов на моем маршрутизаторе с использованием TCP и UDP с моим локальным IP-адресом, который отличался, когда я проверял его сегодня, но я обновил правило, и проблема сохраняется. Все делается через порт 5757. Брандмауэр не является проблемой - я попытался отключить его на другом компьютере, но дружественному клиенту все еще не удается подключиться.
Я проверил тестер переадресации портов на веб-сайте yougetsignal.com, который сообщает, что порт 5757 закрыт как на моем локальном, так и на внешнем IP. Но на момент написания этой статьи у меня был открыт сервер и две клиентские программы (обе из которых используют мой локальный IP-адрес), и я могу успешно отправлять сообщения между этими двумя клиентскими программами. Поэтому, если они могут отправлять сообщения между сервером и обратно, я не понимаю, почему на веб-сайте написано, что порт закрыт на моем локальном IP-адресе.
Может ли кто-нибудь помочь мне понять, почему не удается подключиться к клиенту-другу?
Код сервера :
Module MainModule
Dim _server As TcpListener
Dim _listOfClients As New List(Of TcpClient)
Dim hostName As String = System.Net.Dns.GetHostName
Dim ip As String = System.Net.Dns.GetHostEntry(hostName).AddressList(0).ToString
Dim extip As String = "86.25.175.94"
Dim port As Integer = 5757
Sub Main()
Console.Title = "SERVER"
Try
_server = New TcpListener(IPAddress.Parse(ip), port)
_server.Start()
Threading.ThreadPool.QueueUserWorkItem(AddressOf NewClient)
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
Console.ReadLine()
End Sub
Private Sub NewClient(state As Object)
Dim client As TcpClient = _server.AcceptTcpClient
Try
Threading.ThreadPool.QueueUserWorkItem(AddressOf NewClient)
_listOfClients.Add(client)
Dim ns As NetworkStream = client.GetStream
While True
'Creates a buffer
Dim toReceive(100000) As Byte
Dim length As Integer = ns.Read(toReceive, 0, toReceive.Length)
Dim text As String = Encoding.ASCII.GetString(toReceive, 0, length)
For Each c As TcpClient In _listOfClients
If c IsNot client Then 'Sends a message to every other client besides this one.
Dim nns As NetworkStream = c.GetStream 'New Network Stream
nns.Write(Encoding.ASCII.GetBytes(text), 0, text.Length)
End If
Next
Console.WriteLine(text)
Console.WriteLine()
'Sends a received message receipt.
Dim toSend() As Byte = Encoding.ASCII.GetBytes("Message Received...")
ns.Write(toSend, 0, toSend.Length)
End While
Catch ex As Exception
If _listOfClients.Contains(client) Then
_listOfClients.Remove(client)
End If
Console.WriteLine(ex.Message)
End Try
End Sub
End Module
Код клиента :
Module MainModule
Dim _client As TcpClient
Dim hostName As String = System.Net.Dns.GetHostName
Dim ip As String = System.Net.Dns.GetHostEntry(hostName).AddressList(0).ToString
Dim extip As String = "86.25.175.94"
Dim port As Integer = 5757
Sub Main()
Console.Title = "Chat Client (Host)"
Try
'Gets the local ip address
_client = New TcpClient(ip, port)
'This thread listens for receiving messages from the server.
Threading.ThreadPool.QueueUserWorkItem(AddressOf ReceiveMessages)
While True
'Starts a new stream
Dim ns As NetworkStream = _client.GetStream()
Dim message As String = Console.ReadLine()
Dim toSend() As Byte = Encoding.ASCII.GetBytes(message)
'Sends the message to the server
ns.Write(toSend, 0, toSend.Length)
End While
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
Console.ReadLine()
End Sub
Private Sub ReceiveMessages(state As Object)
Try
While True
'Starts a new network stream (receiving stream) to listen for any receiving messages.
Dim rs As NetworkStream = _client.GetStream
'Creates a buffer to receive text
Dim toReceive(100000) As Byte
'Reads anything coming in from the server.
Dim length As Integer = rs.Read(toReceive, 0, toReceive.Length)
'Converts the byte to text
Dim text As String = Encoding.ASCII.GetString(toReceive, 0, length)
Console.ForegroundColor = ConsoleColor.Green
Console.WriteLine(text)
Console.ResetColor()
Console.WriteLine()
End While
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
End Sub
End Module
Клиент и друг клиента отличаются только одной строкой кода:
_client = New TcpClient(extip, port) 'Friend client connects to external IP
_client = New TcpClient(ip, port) 'My client connects to local IP