将文本数据发送到ip / port lenghth-prefixed case

时间:2016-01-29 08:57:20

标签: vb.net

我想将一些数据(文本)发送到同一网络中的特定IP /端口。我知道我的代码已经足够好了,但我听到了一些关于“但建议使用类似长度前缀的消息” - 你们中的任何人都可以告诉我这是真的,如果是的话那么我应该在我的代码中改变什么什么?

 ''' <summary>
    ''' Send data over TCP/IP network
    ''' </summary>
    ''' <param name="data">Data string to write</param>
    ''' <param name="IP">The connected destination TcpClient</param>
    Public Sub WriteData(ByVal data As String, ByRef IP As String)
        Console.WriteLine("Sending message """ & data & """ to " & IP)
        Dim client As TcpClient = New TcpClient()
        client.Connect(New IPEndPoint(IPAddress.Parse(IP), My.Settings.CommPort))
        Dim stream As NetworkStream = client.GetStream()
        Dim sendBytes As Byte() = Encoding.ASCII.GetBytes(data)
        stream.Write(sendBytes, 0, sendBytes.Length)
    End Sub

1 个答案:

答案 0 :(得分:1)

以下是我的意见:

  • 通常,在数据通信上下文中,消息header是 很高兴(包括消息的Length - 可以放 作为header的一部分,特别是当您的数据不同时 类型和各种长度。

  • 这是因为在接收站点中,它可以选择如何处理 在完全接收所有数据之前输入数据

    1. 例如,如果您有两种数据类型:非常长的文本和高度压缩的图像。标题(首先在接收方接收)将立即告知接收方正在接收哪种数据。

    2. 如果它是一个很长的文本,那么它可以在流完成之前处理它(比如显示部分内容),但是在高度压缩的图像中它无法完成。

  • 在您可能收到多个(不同)的情况下也要考虑 来自发件人和来自相同端口的数据。在这种情况下,拥有 每个消息发送的标题将真正帮助接收者知道, 哪条消息属于哪些数据而不是错误地连接它们。

  • 因此,在这种情况下,前缀长度也可以作为一部分 header - 假设您的接收方可能会收到各种数据 可变长度。通过这个,它还知道何时考虑数据 沟通&#34;完成&#34;形成完整的数据包。

虽然这还没有完成......你通常可能想要检查收到的数据包的完整性(通过使用后缀/附加消息,如CRC)或某种加密/解密。

但总的想法是,出于上述原因,拥有它是好的。