У меня есть прослушиватель TCP в классе vb.net, который прослушивает данные, которые отправляет другая программа.Проблема в том, что он отправляет данные с большей скоростью, чем может обработать моя подпрограмма обработки.Процедура будет примерно на полпути через обработку последнего сообщения, и на порт прослушивания приходит другое сообщение, и она начинает обработку, не заканчивая другое сообщение.Я хочу добавить буфер сообщений, чтобы все входящие текстовые строки помещались в стек, и когда моя процедура обработки будет выполнена, она вытянет следующую строку из стека и будет работать с ней, а затем вытягивать следующую, пока стек не станет пустым.Я не уверен, что лучший способ сделать это.Я смотрю, чтобы увидеть, что кто-то думает, будет лучшим способом справиться с этим.
TIA Rick
Private Sub TCPListening()
Dim CommandString As String = ""
Dim ParamLength As Short
Dim ADIFStr As String = ""
Dim tmpStr As String = ""
Dim tmpBool As Boolean
Dim paramStr As String = ""
Dim xcvrfreq As String = ""
Dim xcvrmode As String = ""
Dim prsvsplit As String = ""
Dim Arr() As String
Dim decimalstr As String = Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator
Dim thousandsstr As String = Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberGroupSeparator
If ExternalTcpListener Is Nothing Then
ExternalTcpListener = New TcpListener(IPAddress.Parse(ExternalTCPIP), ExternalTCPPort)
ExternalTcpListener.Start()
End If
Try
Dim responseString As String = ""
Dim sendBytes As [Byte]()
Dim ExternaltcpClient As TcpClient = ExternalTcpListener.AcceptTcpClient()
While True
Debug.Print("Start While")
Dim networkStream As NetworkStream = ExternaltcpClient.GetStream()
Dim bytes(ExternaltcpClient.ReceiveBufferSize) As Byte
networkStream.Read(bytes, 0, CInt(ExternaltcpClient.ReceiveBufferSize))
Dim Sentdata As String = System.Text.Encoding.ASCII.GetString(bytes)
ttimer.start()
Sentdata = Replace(Sentdata, vbNullChar, "")
If Sentdata <> "" Then Debug.Print("SendData= " & Sentdata)
If InStrRev(Sentdata, "<command:") > 8 Then
'<command:10>CmdSetFreq<parameters:23><xcvrfreq:10> 7,185.000<command:10>CmdGetFreq<parameters:0>
'If multiple commands are recieved this section of the routine splits them up and processes each one as seperate commands.
Sentdata = Strings.Replace(Sentdata, "<command", "|<command")
Arr = Split(Sentdata, "|")
Debug.Print(" Arr=" & UBound(Arr))
For x = 1 To UBound(Arr)
Sentdata = Arr(x)
Debug.Print(" New " & Sentdata)
If InStr(Sentdata, "<command") Then
tmpStr = Sentdata
tmpStr = Right(Sentdata, Len(Sentdata) - 1)
CommandString = Extract(tmpStr, ">", "<")
ParamLength = Extract(Sentdata, "<parameters:", ">")
Select Case CommandString
Case "CmdSetFreqMode", "CmdQSXSplit", "CmdSetFreq", "CmdSetTXFreq", "CmdSetMode", "CmdSplit" ', "CmdTX", "CmdRX"
Station.ActiveWindow.SetExternalTCPCommandsInvoke(Sentdata)
'The above commands are processed and handled in EntryWindow.SetExternalTCPCommands
Case "CmdGetFreq"
'<command:10>CmdGetFreq<parameters:0>
Debug.Print("NI1Inside: " & CommandString & " " & Sentdata)
If ParamLength = 0 Then
tmpStr = Format(Val(Station.ActiveRadio.Frequency), "##,###.000")
responseString = "<CmdFreq:" & Len(tmpStr) & ">" & tmpStr
Debug.Print("[R1] " & responseString)
sendBytes = Encoding.ASCII.GetBytes(responseString)
networkStream.Write(sendBytes, 0, sendBytes.Length)
'LogError("CmdGetFreq1Response - ElapsedTime: " & ttimer.ElapsedMilliseconds)
End If
Case "CmdGetTXFreq"
'<command:12>CmdGetTXFreq<parameters:0>
Debug.Print("NIInside: " & CommandString & " " & Sentdata)
If ParamLength = 0 Then
tmpStr = Format(Val(Station.ActiveRadio.TXFreq), "##,###.000")
If Len(tmpStr) = 0 Then
responseString = "<CmdTXFreq:4>.000"
Else
responseString = "<CmdTXFreq:" & Len(tmpStr) & ">" & tmpStr
End If
Debug.Print("[R1] " & responseString)
sendBytes = Encoding.ASCII.GetBytes(responseString)
networkStream.Write(sendBytes, 0, sendBytes.Length)
'LogError("CmdGetTXFreq1Response - ElapsedTime: " & ttimer.ElapsedMilliseconds)
End If
end select
End If
Next
'End If
ElseIf InStr(Sentdata, "command") And InStrRev(Sentdata, "<command:") < 8 Then
'This section of the routine processes single commands that are sent via the Listener
tmpStr = Sentdata
tmpStr= Right(Sentdata, Len(Sentdata) - 1)
CommandString = Extract(tmpStr, ">", "<")
ParamLength = Extract(Sentdata, "parameters:", ">")
Select Case CommandString
Case "CmdSetFreqMode", "CmdQSXSplit", "CmdSetFreq", "CmdSetTXFreq", "CmdSetMode", "CmdSplit" ', "CmdTX", "CmdRX"
Station.ActiveWindow.SetExternalTCPCommandsInvoke(Sentdata)
'The above commands are processed and handled in EntryWindow.SetExternalTCPCommands
Case "CmdGetFreq"
'<command:10>CmdGetFreq<parameters:0>
Debug.Print("NI2Inside: " & CommandString & " " & Sentdata)
If ParamLength = 0 Then
tmpStr = Format(Val(Station.ActiveRadio.Frequency), "##,###.000")
responseString = "<CmdFreq:" & Len(tmpStr) & ">" & tmpStr
Debug.Print("[R] " & responseString)
sendBytes = Encoding.ASCII.GetBytes(responseString)
networkStream.Write(sendBytes, 0, sendBytes.Length)
'LogError("CmdGetFreqResponse - ElapsedTime: " & ttimer.ElapsedMilliseconds)
End If
Case "CmdGetTXFreq"
'<command:12>CmdGetTXFreq<parameters:0>
Debug.Print("NI2Inside: " & CommandString & " " & Sentdata)
If ParamLength = 0 Then
tmpStr = Format(Val(Station.ActiveRadio.TXFreq), "##,###.000")
If Len(tmpStr) = 0 Then
responseString = "<CmdTXFreq:4>.000"
Else
responseString = "<CmdTXFreq:" & Len(tmpStr) & ">" & tmpStr
End If
Debug.Print("[R] " & responseString)
sendBytes = Encoding.ASCII.GetBytes(responseString)
networkStream.Write(sendBytes, 0, sendBytes.Length)
'LogError("CmdGetTXFreqResponse - ElapsedTime: " & ttimer.ElapsedMilliseconds)
End If
Не хватает много кода, но это дает вам общее представление о том, чтоэто происходит.