Буфер сообщений для прослушивателя TCP - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть прослушиватель 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

Не хватает много кода, но это дает вам общее представление о том, чтоэто происходит.

...