当前位置:编程学习 > C#/ASP.NET >>

急求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
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,