none
vb2005 TcpClient非同步讀取問題? RRS feed

  • 問題

  • 請問各位先進,小弟寫了一個tcpclient用來與sever端進行

    資料傳送以及讀取,傳送沒有問題

    但是讀取時會有少讀的問題,我是採非同步

    讀取程式碼如下:

    Public Sub ReceiveMessage(ByVal ar As IAsyncResult)
            Try
                '停止非同步讀取,並取得資料長度
                bytesRead = clientTCP.GetStream.EndRead(ar)
                clientTCP.GetStream.BeginRead(data, 0, _
                                         CInt(clientTCP.ReceiveBufferSize), _
                                         AddressOf ReceiveMessage, Nothing)

                If bytesRead < 1 Then 

                    Exit Sub
                Else
                    Dim RecvStr As String = Encoding.Default.GetString( _
                                data, 0, bytesRead)
                       ''讀入傳進的資料的長度
                    'Dim Bytes As Integer = ns.Read(data, 0, _
                    '                CInt(clientTCP.ReceiveBufferSize))
                    'Dim RecvStr As NetworkStream = clientTCP.GetStream
                    '將接收資料的程序指派給UpdateReceiveMessage
                        Me.Invoke(New delUpdateReceiveMessage( _
                              AddressOf Me.UpdateReceiveMessage), RecvStr, bytesRead)
                End If
                '繼續開始非同步讀取
                clientTCP.GetStream.BeginRead(data, 0, _
                          CInt(clientTCP.ReceiveBufferSize), _
                          AddressOf ReceiveMessage, Nothing)
            Catch sk As SocketException
                MessageBox.Show("SocketException ErrodCode:" & _
                                sk.ErrorCode.ToString & vbCrLf & _
                                "SocketException Message:" & sk.Message, _
                                "SocketException", _
                                MessageBoxButtons.OK, MessageBoxIcon.Error)
            Catch ex As Exception
                '中斷連線會觸發本事件, 略過不處理
                MessageBox.Show("SocketException ErrodCode:" & _
                                ex.ToString & vbCrLf & _
                                "SocketException Message:" & ex.Message, _
                                "SocketException", _
                                MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        End Sub

    但是有一個問題是我從sever端持續每隔0.25秒發送

    4個byte資料到client,client非同步接收到後

    大部分會是完整的4個byte,但有時候卻不滿

    4個byte,導致我可能要再等下次進入非同步接收

    中斷會接到剩下的資料,請問這是哪裡出了問題

    還是我讀取的方是哪裡出錯了?

    謝謝!

     

    2011年11月24日 上午 03:37

解答

  • 這沒有錯, Tcp 通訊本來就會這樣.
    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年11月24日 上午 04:35
    版主
  • FAQ

    http://social.msdn.microsoft.com/Search/zh-TW/?Refinement=112&query=TcpClient%20MemoryStream


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年11月24日 下午 01:07

所有回覆

  • 這沒有錯, Tcp 通訊本來就會這樣.
    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年11月24日 上午 04:35
    版主
  • FAQ

    http://social.msdn.microsoft.com/Search/zh-TW/?Refinement=112&query=TcpClient%20MemoryStream


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年11月24日 下午 01:07