VB.NET TCP 服务器截断从 networkstream 读取的消息

VB.NET TCP server truncate readed message from networkstream

提问人:Gabriele Cozzolino 提问时间:7/28/2023 更新时间:7/28/2023 访问量:20

问:

我已经实现了这样的TCP侦听器:

Using client As TcpClient = _server.AcceptTcpClient()

                Threading.ThreadPool.QueueUserWorkItem(AddressOf NewClient)

                Using ns As NetworkStream = client.GetStream()

                    While ns.DataAvailable

                        Dim toReceive(100000) As Byte

                        Dim length As Integer = ns.Read(toReceive, 0, toReceive.Length)

                        If length > My.Settings.minLenghtForSuccess Then
                            Dim text As String = Encoding.UTF8.GetString(toReceive, 0, length)
                            text = "{" & text.Split("{")(1)
                            Dim jsonObj As Object = Newtonsoft.Json.JsonConvert.DeserializeObject(text)
                            Dim ipOrigine As String = ""
                            Dim dispositivoOrigine As String = ""
                            Dim canaleOrigine As String = ""
                            Dim targa As String = ""
                            Dim frontespizio = jsonObj("data")(0)
                            ipOrigine = frontespizio("IPAddress")
                            dispositivoOrigine = frontespizio("DeviceName")
                            canaleOrigine = frontespizio("ChannelName")
                            targa = frontespizio("PicData")(0)("PlateInfo")(0)("SnapId")

                        End If
                        'Console.WriteLine(text)
                        'Console.WriteLine()

                        'Dim toSend() As Byte = Encoding.ASCII.GetBytes("Message Received...")

                        'ns.Write(toSend, 0, toSend.Length)

                    End While

                End Using

            End Using

当它收到来自客户端的消息时,它会被截断,我不知道为什么。我认为它是针对 toReceive(100000) var 的。我该如何解决这个问题? 我收到的消息是这样的:

发布 /API/AlarmEvent/EventPush

HTTP/1.1 主机:192.168.2.103:123

接受:/

内容类型:application/json;字符集 = UTF-8

内容长度:106438

{“result”:“success”,“data”:{“EventType”:“LPD”,“EventTime”:“2015-1-15 9:53:39“,”EventAction“:”开始“,”ChannelName“:”PERGENOVA“,”DeviceName“:”BS-IPT4704G3MZ+“,”IPAddress“:”192.168.2.168“,”MacAddress“:”00-23-63-92-25-47“,”PicData“:{”PlateInfo“:[{”Id“:”“,”GrpId“:3,”SnapId“:”AH234MG“,”Type“:10,”StrChn“:”CH1“,”StartTime“:1421315612,”EndTime“:1421315656,”Chn“:0,”“:0,”PlateColor“:0,”CarBrand“:”“,”CarType“:”“,”Owner“:”“,”IdCode“:”“,”Job“:”“,”Phone“:”“,”Domicile“:”“,”Remark“:”“,”PlateImg“:“/9j/4AAQSkZJRgABAQIAdgB2AAD/7wAPAAAAAAAAAAAAAAAAAAAP/bAEMAAwICAwICAwMDAwQDAwQDAwQCAUFBAQFCgcHBggMCgwMCwoLCw0OEhANDhEOCwsQFhARExQVFRUMDxcYFhQYEhQVFP/bAEMBAwQEBQQFCQUFCRQNCw0UFB=”}]}}}

  • PlateImg 很长,超过 100000 字节,其长度不是固定的
JSON vb.net 缓冲区 TCPRepert

评论

0赞 Polarcode 7/28/2023
这可能是由于缓冲区的大小是固定的。您以 100,000 字节的固定大小进行初始化,如果传入消息大于该大小,它将在您观察到时被截断。toReceivetoReceive

答:

1赞 Polarcode 7/28/2023 #1

这可能是由于缓冲区的大小是固定的。您以 100,000 字节的固定大小进行初始化,如果传入消息大于该大小,它将在您观察到时被截断。toReceivetoReceive

请尝试改用动态缓冲区。

例如

Using client As TcpClient = _server.AcceptTcpClient()
    Threading.ThreadPool.QueueUserWorkItem(AddressOf NewClient)

    Using ns As NetworkStream = client.GetStream()
        Dim buffer As New MemoryStream() ' Use MemoryStream as a dynamic buffer

        Dim bytesRead As Integer
        Dim receiveBuffer(4096) As Byte ' Buffer to read incoming data in chunks

        Do
            bytesRead = ns.Read(receiveBuffer, 0, receiveBuffer.Length)
            If bytesRead > 0 Then
                buffer.Write(receiveBuffer, 0, bytesRead)
            End If
        Loop While bytesRead > 0

        buffer.Seek(0, SeekOrigin.Begin) ' Reset the position of the MemoryStream

        Dim receivedData(buffer.Length) As Byte
        buffer.Read(receivedData, 0, receivedData.Length)

        ' Now you have the complete message in the receivedData array as bytes.

        Dim text As String = Encoding.UTF8.GetString(receivedData)
        ' Rest of your code to process the message...

    End Using
End Using

使用动态缓冲区,您可以以块(在本例中为 4096 字节)的形式读取传入数据,并将其追加到缓冲区,直到没有更多数据可读取。然后,您可以将内容转换为字节数组并继续处理收到的消息。MemoryStreamMemoryStream

评论

0赞 Gabriele Cozzolino 7/28/2023
它确实是一个魅力,谢谢!