Проблемы отправки сообщений с TCPClient в vb.net - PullRequest
0 голосов
/ 29 октября 2011

Я реализую приложение чата .NET, но у меня все еще есть эта ошибка: Я могу отправить только сообщение на соединение. Например. С помощью приведенного ниже кода я могу отправить только одно сообщение, которое может быть правильно получено другим партнером, но если я отправлю другое сообщение, по тому же соединению оно не будет получено удаленным ПК. Вот код:

Dim client_TCP As New TcpClient
Private Sub send_obj(ByVal obj As Object)
    Dim bf As New BinaryFormatter
    Dim tosend As Packet

    tosend.data = obj
    bf.Serialize(client_TCP.GetStream(), tosend)
    client_TCP.GetStream.Flush()
End Sub
Private Sub connect_to_port()
    Try
        client_TCP = New TcpClient(client_data.getIP(), client_data.getPort())
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try

End Sub
Private Sub disconnect_from_port()
    client_TCP.Close()
End Sub

А вот и слушатель:

Private Sub Timer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timer.Tick
    If client_TCP_listener.Pending = True Then

        ....
    End If
End Sub

Итак, чтобы отправить сообщение, мне всегда нужно сделать это (пример):

    Dim b As Byte
    b = 1
    disconnect_from_port()
    connect_to_port()
    client_TCP.GetStream().WriteByte(b)
    client_TCP.GetStream().Flush()

Я пытался поставить \ удалить флеш из обоих кодов. Ничего не случилось. У вас есть идеи?!

Ответы [ 2 ]

0 голосов
/ 16 марта 2013

убедитесь, что принимающая сторона также использует .net BinaryFormatter для десерлизации объекта.

0 голосов
/ 19 ноября 2011

Откуда ты знаешь, что оно не получено? Вы пытались эмулировать удаленный хост с вашим собственным кодом?

TCP является потоковым протоколом, который означает, что вы можете отправить два байта, делая два отдельных вызова client_TCP.GetStream (). WriteByte (b) и удаленная сторона может получить эти 2 байта, используя один вызов приема. Не следует делать какие-либо предположения относительно шаблонов вызовов API ввода-вывода (количество записей и количество полученных), а анализировать данные, которые вы отправляете, получая через потоковое соединение.

Таким образом, для отправки сообщений с использованием потокового протокола необходимо ввести понятие протокола приложения. Например, [2bytes-size] [size-bytes of message] - это означает, что если мы хотим отправить сообщение «hello», мы сначала отправим 2 байта, содержащие размер строки «hello», а затем саму строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...