none
MemoryStream和TcpClient問題 RRS feed

  • 問題

  • Public Sub ReceiveData()
    	ReceiveSize = Me.通訊元件.ReceiveBufferSize
    	ReDim Me.ReceiveBlock(ReceiveSize  - 1)
    	Conn.GetStream.BeginRead(Me.ReceiveBlock, 0, ReceiveSize , AddressOf ReceiveDataCallBack, Nothing)
    End Sub
    
    Public Sub ReceiveDataCallBack(ByVal ia As IAsyncResult)
    
        	Dim Count As Integer = Conn.GetStream.EndRead(ia)
        	MemStream.Write(Me.ReceiveBlock, 0, Count)
        	MemStream.Seek(0, SeekOrigin.Begin)
        	
    	'以下利用說明的部分為我想要改寫的地方
    	'假設我會先傳送此次資料量大小:Size,TmpCount為累加數
    	'TmpCount = TmpCount + Count
    	'if TmpCount >= Size時
    		Dim Obj As Object = Nothing
        		Obj = BF.Deserialize()
        		MemStream.SetLength(0)
    	'end if
    	Conn.GetStream.BeginRead(Me.ReceiveBlock, 0, ReceiveSize , AddressOf ReceiveDataCallBack, Nothing)
    End Sub


    先前自己發問過類似問題,不過當時已經解決,當時因為序列化後的檔案不會大於8192所以沒進行分次接收。如上面程式碼沒有註解部分為先前的。

    現在可能會大於8192,所以必須要分次接收,有幾個問題想要請教。

    (1)參考論壇其他文章,建議在傳送真實資料前,先告訴接收端,檔案大小。再透告接收量來判斷讀取量,是否我註解部分?

    (2)如果檔案被分次送,那麼不保證接收順序,所以我在將資料寫進記憶體,順序可能會亂掉,會影響到反序列化的工作嗎?如果會我該如何加強

            MemStream.Write(Me.ReceiveBlock, 0, Count)
            MemStream.Seek(0, SeekOrigin.Begin)

    (3)當然這是我自己想的,應該會有很多不足的地方,想請問是否已有資源可以參考?


    2011年9月19日 上午 08:00

解答

所有回覆

  • 1. 不是。自訂通訊協定可以隨便搞,要加在那也可以。

    2. UDP 才不保證接收順序,TCP 無此問題。

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


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 小見光二 2011年9月21日 上午 11:28
    2011年9月19日 下午 12:52
  • 請問第二點 可以在再解釋一下嗎? 那同時開很多TcpClient時,且同時傳送資料,會互相有所影響嗎?

    所以是否基於第二點,會按照順序,而我們以TcpClient方式開發網路通訊的方式,只要注重資料的處理就

    好。

    2011年9月20日 下午 02:59
  • 多個 TcpClient 應該要寫成多個執行緒分別跑,所以本身跟多個沒關係。

    你把 Tcp / Udp 差異搞清楚時,就知道這是最基本差異,如果連 MSDN 這差異比較都沒看,你就根本不該開始寫網路程式。


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