急求socket交易问题
WEB应用程序通过 socket 与主机进行通信,解包后写入文件,以前正常进行,现在出现新情况,解包数据不完整,什么原因,求解释,代码:
Private Function Receive(ByRef state As StateObject, ByVal Merch_ID As String, ByVal ULNm As String) As Boolean '增加Merch_ID,ULNm zfy 2011-1-6 用于生成Merch_ID.txt文件
On Error GoTo go_Err
Dim readStream As New NetworkStream(state.workSocket)
Dim blnReturn As Boolean = False
Dim intRcv As Integer
Dim strTmp As String = ""
state.buffer.Clear(state.buffer, 0, StateObject.BufferSize)
readStream.ReadTimeout = iTimeOutM
intRcv = readStream.Read(state.buffer, 0, StateObject.BufferSize)
Do While intRcv > 0
strTmp = Encoding.Default.GetString(state.buffer, 0, intRcv)
state.sb.Append(strTmp)
If ConfigurationManager.AppSettings("g_IsDebug") = "1" Then
Dim FileToWrite As System.IO.FileStream = System.IO.File.Create("D:\程序\ESA_OPR_New\debug\Receive" + Merch_ID + "_" + ULNm + ".txt")
Dim rByte() As Byte = Encoding.Default.GetBytes(state.sb.ToString.ToCharArray)
FileToWrite.Write(rByte, 0, rByte.Length)
FileToWrite.Close()
FileToWrite = Nothing
End If
'不按照报文头字符长度来取报文体字段,因为在测试中发现WINDOWS与UNIX在中文和特殊字符的长度判断上不相同
'所以采用查找结束符号的方式来判断报文尾
If InStr(strTmp, "</PACKAGE>") > 0 Then
Exit Do
Else
state.buffer.Clear(state.buffer, 0, StateObject.BufferSize)
intRcv = readStream.Read(state.buffer, 0, StateObject.BufferSize)
End If
Loop
blnReturn = True
readStream = Nothing
go_Exit:
Return blnReturn
Exit Function
go_Err:
blnReturn = False
GoTo go_Exit
End Function
解包数据:
--------------------编程问答-------------------- 没有人知道吗 --------------------编程问答-------------------- 这个程序写的是错误的!!
state.buffer是byte[];
但是stat.sb.append(strTmp)接受是string
一个字符被转化成byte[],被发送/接受时,有可能被截断,分成两次发送/接受,这是时候你strTmp = Encoding.Default.GetString(state.buffer, 0, intRcv)肯定错了。 --------------------编程问答-------------------- 不是不能按照报文的字符长度来判断结尾,那样存在字符编码问题
而是应该根据数据转换成的byte[]的长度判断结尾。 --------------------编程问答-------------------- 我改了下接收数据缓冲区大小,现在问题没出
原来是Public Const BufferSize As Integer = 1024 * 512
现在改成Public Const BufferSize As Integer = 1024 * 28
因为每个包的大小最大不超过28K
还有另外一个问题,比较严重:两个或两个以上用户同时进行查询,查询时间分别为30秒,第一个用户查询10秒后,第二个用户开始查询,两个用户得到的结果都是第一个用户的,或者第一个查不到,第二个查询显示的是第一个的查询结果,这是什么原因
补充:.NET技术 , ASP.NET