TCP-сервер в VB.NET - PullRequest
       15

TCP-сервер в VB.NET

0 голосов
/ 19 марта 2012

Я не программист, но у меня есть задача создать TCP-сервер (программу, которая прослушивает интерфейсы своей сетевой карты для входящих потоков данных).

Я искал в Интернете и обнаружил, что могу использовать два метода: класс Socket или TCPListener.

Я создал пример для класса Socket, но мне было интересно, как я могу его протестировать?

Если другой компьютер в сети отправляет некоторые строковые данные на компьютер слушателя, то сообщение должно отображаться.

Вот пример от Microsoft, который я использую для TCP-сервера с использованием сокета:

    Public Shared Sub Main()
        ' Data buffer for incoming data.
        Dim data = nothing
        Dim bytes() As Byte = New [Byte](1024) {}
        Dim ipAddress As IPAddress = ipAddress.Any
        Dim localEndPoint As New IPEndPoint(ipAddress, 0)

        Dim intI As Integer = 0
        'Display the NIC interfaces from the listener
        For Each ipAddress In ipHostInfo.AddressList
            Console.WriteLine("The NIC are  {0}", ipHostInfo.AddressList(intI))
            intI += 1
        Next
           Console.WriteLine("You are listening on {0}",localEndPoint)
        ' Create a TCP/IP socket.
        Dim listener As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)

        ' Bind the socket to the local endpoint and 
        ' listen for incoming connections.
        Try
            listener.Bind(localEndPoint)
            listener.Listen(200)
        Catch e As SocketException
            Console.WriteLine("An application is alreading using that combination of ip adress/port", e.ErrorCode.ToString)
        End Try

        ' Start listening for connections.
        While True
            Console.WriteLine("Waiting for a connection...")
            ' Program is suspended while waiting for an incoming connection.
            Dim handler As Socket = listener.Accept()
            data = Nothing
            ' An incoming connection needs to be processed.
            While True
                bytes = New Byte(1024) {}
                Dim bytesRec As Integer = handler.Receive(bytes)
                data += Encoding.ASCII.GetString(bytes, 0, bytesRec)
                Console.WriteLine("The string captured is  {0}", data)
                If data.IndexOf("something") > -1 Then
                    Exit While
                End If
            End While
            ' Show the data on the console.
            Console.WriteLine("Text received : {0}", data)
            ' Echo the data back to the client.
            Dim msg As Byte() = Encoding.ASCII.GetBytes(data)
            handler.Shutdown(SocketShutdown.Both)
            handler.Close()
        End While
    End Sub
End Class

Я на правильном пути? Спасибо

Позже Править: Я использовал этот код в консольном приложении, созданном с помощью Visual Studio, и хочу проверить сценарий, когда устройство отправляет какое-либо строковое сообщение по сети. Например: У меня есть два устройства: компьютер A, компьютер B, подключенный через локальную сеть Я пробовал эту команду: telnet computerA порт (с компьютера B), но ничего не отображается на TCP-сервере, работающем с компьютера A.

телнет 192.168.0.150 3232

Я также сделал TCP-клиент для тестирования (по примеру Microsoft):

Public Class SynchronousSocketClient

    Public Shared Sub Main()
        ' Data buffer for incoming data.
        Dim bytes(1024) As Byte

        Dim ipHostInfo As IPHostEntry = Dns.GetHostEntry(Dns.GetHostName())
        Dim ipAddress As IPAddress = ipHostInfo.AddressList(0)
        Dim remoteEP As New IPEndPoint(ipAddress, 11000)

        ' Create a TCP/IP socket.
        Dim sender As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)

        ' Connect the socket to the remote endpoint.
        sender.Connect(remoteEP)

        Console.WriteLine("Socket connected to {0}", _
            sender.RemoteEndPoint.ToString())

        ' Encode the data string into a byte array.
        Dim msg As Byte() = _
            Encoding.ASCII.GetBytes("This is a test<EOF>")

        ' Send the data through the socket.
        Dim bytesSent As Integer = sender.Send(msg)

        ' Receive the response from the remote device.
        Dim bytesRec As Integer = sender.Receive(bytes)
        Console.WriteLine("Echoed test = {0}", _
            Encoding.ASCII.GetString(bytes, 0, bytesRec))

        ' Release the socket.
        sender.Shutdown(SocketShutdown.Both)
        sender.Close()
        Console.ReadLine()
    End Sub

End Class 'SynchronousSocketClient

Но это не работает из-за настройки ПОРТА. Если в TCP-сервере у меня есть «Dim localEndPoint As New IPEndPoint (ipAddress, 0)», то происходит сбой клиента, но если я, например, изменяю порт с любого (0) на 11000, клиент работает нормально. Ты знаешь почему?

Позже отредактируйте 2: Может быть, мне следовало начать с этого вопроса: какой метод рекомендуется для моей области применения - асинхронный или синхронный метод?

Ответы [ 2 ]

0 голосов
/ 19 марта 2012

Да, вы на правильном пути.

Следующее, что нужно сделать, это ввести обнаружение сообщений, поскольку TCP основан на потоке, а не на сообщениях, как UDP. Это означает, что TCP может решить отправить два ваших сообщения в одном и том же пакете (чтобы одно socket.Recieve получило два сообщения) или разделить ваше сообщение на два пакета (таким образом, вам потребуется использовать два socket.Recieve для получить его).

Два самых распространенных способа обнаружения сообщений:

  • Создать заголовок фиксированного размера, который включает размер сообщения
  • Создать разделитель, который добавляется ко всем сообщениям.
0 голосов
/ 19 марта 2012

Ваш «сервер» не прослушивает заданный порт, поэтому вам нужно обратить внимание на появившееся сообщение «Вы слушаете».Затем с другого компьютера в сети telnet the.ip.add.ress port.(Для этого может потребоваться установить «клиент telnet» или включить его в разделе «Программы и компоненты», или что-то в этом роде.)

Примечание: если вы на самом деле собираетесь использовать этот сервер, выЯ захочу решить, какой порт вы хотите использовать, чтобы другие компьютеры могли найти ваш сервис.Большинство людей не смогут прочитать ваш экран, чтобы выяснить, где подключиться.:)

Что касается вашего "клиента" ... когда вы подключаетесь к другому компьютеру, вы не просто "выбираете порт" (что означает номер порта 0 в конечной точке).Вам нужно знать, какой порт использует сервер.(Перечитайте то, что я сказал в предыдущем параграфе. Программа, запущенная на другом компьютере, не знает, какой порт использовать для подключения к серверу - любой сервер может работать на любом порту.) Вам необходимо выбрать номер порта для сервера.(скажем, 11000 ... хорошо, как любой, на самом деле) вместо того, чтобы позволить ему использовать порт 0.

...