问题在vb.net中使用TCPClient发送消息

时间:2011-10-29 19:25:55

标签: vb.net networking network-programming

我正在实现一个.NET聊天应用程序,但我仍然有这个错误: 我每个连接只能发送一条消息。 例如。使用下面的代码,我只能发送一条可以被另一个对等方正确接收的消息,但如果我发送另一条消息,则在同一个连接上,远程PC将不会接收该消息。 这是代码:

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()

我试图把\从两个代码中删除flush。没啥事儿。 你有什么想法吗?!

2 个答案:

答案 0 :(得分:0)

你怎么知道没有收到?您是否尝试使用自己的代码模拟远程主机?

TCP是一种流协议,这意味着您可以发送两个字节,对client_TCP.GetStream()进行两次单独的调用.WriteByte(b)和远程方可以使用一个Receive调用接收这两个字节。您不应对I / O API调用模式(写入次数和接收次数)做任何假设,而是分析您通过流连接发送的数据。

因此,要使用流协议发送消息,您必须引入应用程序协议的概念。例如[2bytes-size] [消息的大小字节] - 这意味着如果我们想发送“hello”消息,我们首先会发送包含“hello”字符串大小的2个字节,然后发送字符串本身。 / p>

答案 1 :(得分:0)

确保接收端也使用.net BinaryFormatter来对对象进行deserlize。