none
【VB2010】NetworkStream.Read 出來的 文字後方相當多的空白?! RRS feed

  • 問題

  • 前輩們好
    小弟參閱BILL大大的範例發現一個問題

    (實作同步 .NET Socket TCP《使用TcpClient與TcpListener類別》)
    http://www.dotblogs.com.tw/billchung/archive/2009/06/14/8817.aspx

    當我將收到的訊息寫入文字檔的時候
    發現每則訊息中間有相當多的空白
    不知道為何?
    望各為大大解惑
    PS:範例是用VB2005 我是用2010

    Private Sub ReceiveData(ByVal state As Object)
            Dim myObj As New CSState
            myObj.ClientSocket = CType(state, CSState).ClientSocket
            myObj.myTcpListener = CType(state, CSState).myTcpListener
            myObj.mystring = ""
            Dim myNetworkStream As New NetworkStream(myObj.ClientSocket)
            Dim InBytesCount As Integer = 0
            Dim myReceiveBytes(1023) As Byte
    
            While True
                Try
                    InBytesCount = myNetworkStream.Read(myReceiveBytes, 0, myReceiveBytes.Length)
                    System.Threading.Thread.Sleep(100)
                    If InBytesCount = 0 Then
                        Exit While
                    End If
                    myObj.mystring = Encoding.GetEncoding(950).GetString(myReceiveBytes).TrimEnd().TrimStart()
    
                    Dim writer = My.Computer.FileSystem.OpenTextFileWriter("c:\20121023.txt", True)
                    writer.WriteLine(myObj.mystring)
                    writer.Close()
    
    
                    DisplayMsg1(myObj)
                Catch ex As Exception
                    DisplayMsg1(ex.ToString)
    
                    Exit Sub
                End Try
            End While
        End Sub



    2012年10月23日 上午 11:36

解答

  • 我知道問題點了

    Dim myReceiveBytes(1023) As Byte

    因為先宣告了長度

    所以字串後面才有相當多的空白格

    所以我加上這一行

    就解決問題了

    這方法還是Bill大大以前教我的

    ReDim Preserve myReceiveBytes(InBytesCount)

    • 已標示為解答 Rickyjim 2012年10月23日 上午 11:52
    2012年10月23日 上午 11:52
  • 錯。

    陣列應宣告為 Buffer 大小。用迴圈讀時,應該包含 Sleep ,你沒注意到 CPU 效能遠比網路快,迴圈跑完到下次,未必網路已經又塞了資料進來。所以小範圍資料應該讀到 MemoryStream 內。

    FAQ

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


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    • 已標示為解答 Rickyjim 2012年10月23日 下午 02:55
    2012年10月23日 下午 02:37

所有回覆

  • 我知道問題點了

    Dim myReceiveBytes(1023) As Byte

    因為先宣告了長度

    所以字串後面才有相當多的空白格

    所以我加上這一行

    就解決問題了

    這方法還是Bill大大以前教我的

    ReDim Preserve myReceiveBytes(InBytesCount)

    • 已標示為解答 Rickyjim 2012年10月23日 上午 11:52
    2012年10月23日 上午 11:52
  • 錯。

    陣列應宣告為 Buffer 大小。用迴圈讀時,應該包含 Sleep ,你沒注意到 CPU 效能遠比網路快,迴圈跑完到下次,未必網路已經又塞了資料進來。所以小範圍資料應該讀到 MemoryStream 內。

    FAQ

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


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    • 已標示為解答 Rickyjim 2012年10月23日 下午 02:55
    2012年10月23日 下午 02:37
  • 嗯嗯

    謝謝您

    裡面的範例code 有包含Sleep

    2012年10月23日 下午 02:58