TcpListener 句柄 POST 响应变量
TcpListener handle POST Response variables
我们有一个基本的打印客户端,它使用 Ajax 侦听从 Web 发送的连接。发送了几个变量,例如 Jquery 请求上下文:
$.ajax({
url : 'http://127.0.0.1:13000',
type : 'POST',
data : {
'shipmentNumber': 'SAMPLESN998SSkLAIS',
'labelType': 'labelTypePostageEND',
'pdfLabel': 'pdfLabel__'
}
这被视为
POST / HTTP/1.1 Host: 127.0.0.1:13000 Connection: keep-alive
Content-Length: 70621 Accept: / Origin: null User-Agent: Mozilla/5.0
(Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/59.0.3071.109 Safari/537.36 Content-Type:
application/x-www-form-urlencoded; charset=UTF-8 Accept-Encoding:
gzip, deflate, br Accept-Language: en-GB,en-US;q=0.8,en;q=0.6
shipmentNumber=SAMPLESN998SSkLAIS&labelType=labelTypeRoyalMailEND&pdfLabel=
我需要最终得到"labelType"、"shipmentNumber"等等(注意,labelType/END是我如下图搜索的字符串,不是我想要的数据的一部分), out 作为要使用的变量,我不确定执行此操作的最佳方法。目前我有(简化):
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
如您所见,我在响应中搜索 "markers" 或我在其中输入的分隔符;感觉会不靠谱,应该有更好的办法。我有 seen some questions related but they don't directly address this,我不确定这些是否正确。这可能已经是最好的方法,但不问我不知道。
您会使用什么方法来做到这一点?
有没有更好的方法?
使用shipmentNumber=
作为关键字找到参数的开始。然后使用 &
分隔符拆分它。然后循环使用 =
分隔符将它们分成 parameters/values。
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
我们有一个基本的打印客户端,它使用 Ajax 侦听从 Web 发送的连接。发送了几个变量,例如 Jquery 请求上下文:
$.ajax({
url : 'http://127.0.0.1:13000',
type : 'POST',
data : {
'shipmentNumber': 'SAMPLESN998SSkLAIS',
'labelType': 'labelTypePostageEND',
'pdfLabel': 'pdfLabel__'
}
这被视为
POST / HTTP/1.1 Host: 127.0.0.1:13000 Connection: keep-alive Content-Length: 70621 Accept: / Origin: null User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.109 Safari/537.36 Content-Type: application/x-www-form-urlencoded; charset=UTF-8 Accept-Encoding: gzip, deflate, br Accept-Language: en-GB,en-US;q=0.8,en;q=0.6 shipmentNumber=SAMPLESN998SSkLAIS&labelType=labelTypeRoyalMailEND&pdfLabel=
我需要最终得到"labelType"、"shipmentNumber"等等(注意,labelType/END是我如下图搜索的字符串,不是我想要的数据的一部分), out 作为要使用的变量,我不确定执行此操作的最佳方法。目前我有(简化):
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
如您所见,我在响应中搜索 "markers" 或我在其中输入的分隔符;感觉会不靠谱,应该有更好的办法。我有 seen some questions related but they don't directly address this,我不确定这些是否正确。这可能已经是最好的方法,但不问我不知道。
您会使用什么方法来做到这一点?
有没有更好的方法?
使用shipmentNumber=
作为关键字找到参数的开始。然后使用 &
分隔符拆分它。然后循环使用 =
分隔符将它们分成 parameters/values。
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