提问人:Gabriele Cozzolino 提问时间:7/28/2023 更新时间:7/28/2023 访问量:20
VB.NET TCP 服务器截断从 networkstream 读取的消息
VB.NET TCP server truncate readed message from networkstream
问:
我已经实现了这样的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 字节,其长度不是固定的
答:
这可能是由于缓冲区的大小是固定的。您以 100,000 字节的固定大小进行初始化,如果传入消息大于该大小,它将在您观察到时被截断。toReceive
toReceive
请尝试改用动态缓冲区。
例如
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 字节)的形式读取传入数据,并将其追加到缓冲区,直到没有更多数据可读取。然后,您可以将内容转换为字节数组并继续处理收到的消息。MemoryStream
MemoryStream
评论
toReceive
toReceive