Re: [問題] 請問 Socket 的資料流接收, Buffer 的問題

看板C_Sharp (C#)作者 (可口瓜瓜)時間15年前 (2010/10/09 01:54), 編輯推噓4(400)
留言4則, 1人參與, 最新討論串3/3 (看更多)
借這個標題發問,目前也遇到無法完全接收server傳出來的檔案, 程式碼如下,如果不讓第一個//Thread.Sleep運作,就無法正常接收檔案, 第二個sleep時間太短也會接收到一半就停住了, 但是我實在不知道為啥要加這兩個sleep才可以比較正常運作 (檔案太大有時候還是無法完全接收),但是加sleep實在是拖累傳送速率, 不知道是否有解決辦法?傳送檔案大小大概在10MB以內. 希望有人可能幫忙提供意見或是關鍵字Q_Q感謝... networkStream = tcpClient.GetStream(); Thread.Sleep(2000);//第一個sleep if (networkStream.CanRead) { FileStream filestream = new FileStream("D://test.bak", FileMode.Create); byte[] recvbytes = new byte[tcpClient.ReceiveBufferSize]; int chk; int sum = 0; while (networkStream.DataAvailable) { Thread.Sleep(150);//第二個sleep chk = networkStream.Read(recvbytes, 0, recvbytes.Length); sum += chk; filestream.Write(recvbytes, 0, chk); }; ※ 引述《KENyroj (難得一身雞蛋糕...)》之銘言: : 目前的改良版是這樣... 不過還是有問題.. @@ : int CurPos = 0; : byte[] RecvBuf = new byte[m_Client.ReceiveBufferSize]; : int Recved = m_NetworkStream.Read(RecvBuf, CurPos, RecvBuf.Length); : while (m_NetworkStream.DataAvailable) : { : FileStr.Write(RecvBuf, CurPos, Recved); : CurPos = +Recved; : Recved = m_NetworkStream.Read(RecvBuf, CurPos, RecvBuf.Length); : } : 錯誤發生在此... : 類型 System.ArgumentOutOfRangeException 的未處理例外狀況發生於 System.dll : 我在要取得這個 Read() 的回傳值就已經被打槍了... @@ : 請問有什麼解決之道嗎?? 謝謝 ^^" : __yroj -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 211.74.244.54

10/09 10:35, , 1F
能控制server就傳固定長度,標記傳多長,最後再接起來
10/09 10:35, 1F

10/09 10:42, , 2F
socket記得有傳輸上限,一次傳個1K或幾K應該OK
10/09 10:42, 2F
樓上的大大,可否說詳細一點呢?若以8k為一包是不是說在sever端將資料拆成n*8k, 分批傳送至Client,在Client在做組合?(不知道是不是這個意思以及可行性?) ※ 編輯: kakafood 來自: 140.116.72.46 (10/09 12:51)

10/09 15:46, , 3F
你說對了,不足8K的看你的做法,固定會比較簡單
10/09 15:46, 3F

10/09 15:50, , 4F
雖然可能不是最佳解法,不過我拆成1K傳幾MB是OK的
10/09 15:50, 4F
文章代碼(AID): #1Chrh0f2 (C_Sharp)
文章代碼(AID): #1Chrh0f2 (C_Sharp)