作者kakafood (可口瓜瓜)
看板C_Sharp
标题Re: [问题] 请问 Socket 的资料流接收, Buffer 的问题
时间Sat Oct 9 01:54:06 2010
借这个标题发问,目前也遇到无法完全接收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
1F:推 hoihkj:能控制server就传固定长度,标记传多长,最後再接起来 10/09 10:35
2F:推 hoihkj:socket记得有传输上限,一次传个1K或几K应该OK 10/09 10:42
楼上的大大,可否说详细一点呢?若以8k为一包是不是说在sever端将资料拆成n*8k,
分批传送至Client,在Client在做组合?(不知道是不是这个意思以及可行性?)
※ 编辑: kakafood 来自: 140.116.72.46 (10/09 12:51)
3F:推 hoihkj:你说对了,不足8K的看你的做法,固定会比较简单 10/09 15:46
4F:推 hoihkj:虽然可能不是最佳解法,不过我拆成1K传几MB是OK的 10/09 15:50