Программа TCP Client не будет подключаться к моему серверу - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь создать базовую программу сервера-клиента чата, используя 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

1 Ответ

0 голосов
/ 10 сентября 2018

Ваша проблема здесь:

_server = New TcpListener(IPAddress.Parse(ip), port)

Перегрузка TcpListener(IPAddress, Int32) указывает, какой IP-адрес принимает подключения от , что означает, что он будет принимать подключения только от ONLY этот IP (в данном случае ваш локальный адрес).

Чтобы исправить это, вы должны прослушивать соединения на IPAddress.Any (эквивалент 0.0.0.0), который указывает, что он должен принимать соединения от любых IP-адрес.

_server = New TcpListener(IPAddress.Any, port)
...