【问题标题】:TcpListener handle POST Response variablesTcpListener 处理 POST 响应变量
【发布时间】:2017-12-02 10:00:31
【问题描述】:

我们有一个基本的打印客户端,它使用 Ajax 侦听从 Web 发送的连接。发送了几个变量,例如 Jquery 上下文请求:

$.ajax({
            url : 'http://127.0.0.1:13000',
            type : 'POST',
            data :  {
          'shipmentNumber': 'SAMPLESN998SSkLAIS',
          'labelType': 'labelTypePostageEND',
          'pdfLabel': 'pdfLabel__'
        }

这被视为

POST / HTTP/1.1 主机:127.0.0.1:13000 连接:保持活动状态 内容长度:70621 接受:/ 来源:空用户代理:Mozilla/5.0 (Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如 Gecko) Chrome/59.0.3071.109 Safari/537.36 内容类型: 应用程序/x-www-form-urlencoded; charset=UTF-8 接受编码: gzip, deflate, br 接受语言:en-GB,en-US;q=0.8,en;q=0.6 shippingNumber=SAMPLSN998SSkLAIS&labelType=labelTypeRoyalMailEND&pdfLabel=

我最终需要得到“labelType”、“shipmentNumber”等(注意,labelType/END 是我搜索的字符串,如下所示,不是我想要的数据的一部分),作为要使用的变量,我是不确定执行此操作的最佳方法。目前我有(简化):

        Dim port As Int32 = 13000
        Dim localAddr As IPAddress = IPAddress.Parse("127.0.0.1")

        server = New TcpListener(localAddr, port)

        ' Start listening for client requests.
        server.Start()

        ' Buffer for reading data
        Dim bytes(10240000) As Byte
        Dim data As String = Nothing

        ' Enter the listening loop.
        While True

            Dim client As TcpClient = server.AcceptTcpClient()

            data = Nothing

            ' Get a stream object for reading and writing
            Dim stream As NetworkStream = client.GetStream()

            Dim i As Int32

            ' Loop to receive all the data sent by the client.
            i = stream.Read(bytes, 0, bytes.Length)
            data = System.Text.Encoding.ASCII.GetString(bytes, 0, 5000)

            ' >>>> The bit that matters, split the data based on what we know will be there
            Dim searchIndex As Integer = data.IndexOf("labelType")
            Dim f As String = data.Substring(searchIndex + 1, data.IndexOf("END", searchIndex + 1) - searchIndex - 1)

            MessageBox.Show(data)

            ' >>> Response and Close connection removed to keep question clean
        End While

如您所见,我在响应中搜索“标记”或我放在那里的分隔符;感觉它会不可靠,应该有更好的方法。我有seen some questions 相关但他们没有directly address this,我不确定这些是否正确。这可能已经是最好的方法了,但不问我不知道。

你会使用什么方法来做到这一点?

有没有更好的办法?

【问题讨论】:

    标签: vb.net post tcp tcplistener


    【解决方案1】:

    使用shipmentNumber= 作为关键字查找参数的开头。然后使用 & 分隔符将其拆分。然后循环使用= 分隔符将它们拆分为参数/值。

    data = System.Text.Encoding.ASCII.GetString(bytes, 0, 5000)
    
    Dim dataStart As String = "shipmentNumber="
    
    If data.Contains(dataStart) Then
        data = data.Substring(data.IndexOf(dataStart)).Trim
        Dim _params() As String = Split(data, "&")
        For Each p In _params
            Dim _values() As String = Split(p, "=")
            If _values.Length > 0 Then
                Dim _parameter As String = _values(0)
                Dim _value As String = ""
                If _values.Length > 1 Then
                    _value = _values(1)
                End If
                Debug.Print("parameter = " & _parameter)
                Debug.Print("value = " & _value)
            End If
        Next
    End If
    

    【讨论】:

      猜你喜欢
      • 2015-07-25
      • 2016-07-15
      • 2012-05-15
      • 1970-01-01
      • 2017-06-23
      • 1970-01-01
      • 1970-01-01
      • 2015-04-05
      • 2015-06-28
      相关资源
      最近更新 更多