有关 http 返回包分包的问题

Antiquesoft 2008-06-04 10:27:32
Public Function SendPost(ServerAdd As String, Port As String, url As String, PostData As String, strMethod As String, bSign As Boolean) As String
Dim xmlObj As XMLHTTP
Dim data() As Byte '定义发送数据数据,用于INFOSEC_SIGN/1.0
On Error GoTo my_err:
Set xmlObj = CreateObject("Msxml2.XMLHTTP.4.0")
'Set xmlObj = New XMLHTTP
Call WriteBankLog("建立xml对象成功")
Dim strUrl As String
strUrl = "http://" + ServerAdd + ":" + Port + url
Call WriteBankLog("Url:" + strUrl)
Call xmlObj.Open(strMethod, strUrl, False)

Call WriteBankLog("postdata:" + PostData)
'设置头格式
If bSign Then
Call xmlObj.setRequestHeader("Content-Type", "INFOSEC_SIGN/1.0")
Call xmlObj.setRequestHeader("Content-Length", CStr(LenB(StrConv(PostData, vbFromUnicode))))
data = StrConv(PostData, vbFromUnicode)
Call xmlObj.Send(data) '发送数据
Else
Call xmlObj.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
PostData = URLEncoding(PostData)
Call xmlObj.Send(PostData) '发送数据
End If
Call WriteBankLog("发送数据成功")

Dim retData As String
retData = bytes2BSTR(xmlObj.responseBody) '这得到包是第一个包,其他的包怎么来收?

MsgBox xmlObj.Status
Call WriteBankLog("接收报文:" & retData)

xmlObj.abort
SendPost = retData
Exit Function
my_err:
Call WriteBankLog("err:" + ERR.Description)

End Function

返回包分为两个以上,
retData = bytes2BSTR(xmlObj.responseBody)
这句永远得到是第一个包,不完整!怎么来处理!
...全文
1361 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
fj182 2008-06-06
  • 打赏
  • 举报
回复
呵呵,多谢MVP的教导~~~

daisy8675 2008-06-06
  • 打赏
  • 举报
回复
不会的东西最好自己学会,而不是随口乱猜.
fj182 2008-06-06
  • 打赏
  • 举报
回复
没人告诉我,我猜的,我总是喜欢用猜的~~~
daisy8675 2008-06-06
  • 打赏
  • 举报
回复
谁告诉你没有意义了
fj182 2008-06-06
  • 打赏
  • 举报
回复
Private Sub Command1_Click()

Dim xh As New MSXML2.XMLHTTP

xh.open "Get", "http://www.csdn.net", False
xh.send

' While xh.readyState <> 4 ' 这段代码是没有意义的
' DoEvents
' Wend

Me.RichTextBox1.Text = xh.responseText

End Sub
fj182 2008-06-05
  • 打赏
  • 举报
回复
我看了三遍代码都没有找到用Winsock的...

xmlHttp.Open 的第三个参数设置是否异步处理,楼主已经设置为 False,那么就不用考虑数据是否已经发送或者接收完成。
Http通讯是一个请求对应一个响应,难道可以一个请求多个响应?xmlHttp是一个对Http通讯的高层封装,不会让你自己去处理拆包封包的细节。
另外,如果你要解析返回的内容,建议直接使用 responseText 或 responseXML,前者已经是字符串,而后者则为一个DOMDocument,可以直接使用。
Antiquesoft 2008-06-05
  • 打赏
  • 举报
回复
那应该怎么写呀!
老大,有没有例子!

谢谢!
daisy8675 2008-06-05
  • 打赏
  • 举报
回复
拿CSDN的做个例子


Private Sub Command1_Click()

Dim xh As New MSXML2.XMLHTTP

xh.open "Get", "http://www.csdn.net", False
xh.send

While xh.readyState <> 4
DoEvents
Wend

Me.RichTextBox1.Text = xh.responseText

End Sub
daisy8675 2008-06-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fj182 的回复:]
我看了三遍代码都没有找到用Winsock的...

xmlHttp.Open 的第三个参数设置是否异步处理,楼主已经设置为 False,那么就不用考虑数据是否已经发送或者接收完成。
Http通讯是一个请求对应一个响应,难道可以一个请求多个响应?xmlHttp是一个对Http通讯的高层封装,不会让你自己去处理拆包封包的细节。
另外,如果你要解析返回的内容,建议直接使用 responseText 或 responseXML,前者已经是字符串,而后者则为一个DOMDocumen…
[/Quote]

昨天晚上没看清楚,话说你这个代码质量也写得太差了点

用xml的话用readyState去判断就好了
CathySun118 2008-06-05
  • 打赏
  • 举报
回复
参考:
http://hi.baidu.com/%CA%AF%CA%D7/blog/item/ff845454617f2f57564e0093.html
daisy8675 2008-06-05
  • 打赏
  • 举报
回复
不应该写在一个function里面

而是对应事件分开

winsock的Connect为去send

DataArrival去接包.接完包以后再去解码 或者一边接包一边解码,因为必须DataArrival会触发多次的.

友情提醒一下:bytes2BSTR这个函数其实相当得不好用,也没必要用

1,502

社区成员

发帖
与我相关
我的任务
社区描述
VB 网络编程
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧