首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

c# socket怎么传输大数据

2012-09-23 
c# socket如何传输大数据我服务端通过SOCKET向客户端发送大数据(M以上的数据),数据大后,容易掉包,用多线程

c# socket如何传输大数据
我服务端通过SOCKET向客户端发送大数据(M以上的数据),数据大后,容易掉包,用多线程的话不掉包,但是速度又比较慢了。

请教各位大神了!

[解决办法]
<code C#>
const int blockLength=512*1024;
public void SendFile(string filePath, NetworkStream stream) //发送文件
{
//传输内容
using (FileStream fs = File.Open(filePath, FileMode.Open))
{
int readLength = 0;
byte[] data = new byte[blockLength];

//发送大小
byte[] length = new byte[8];
BitConverter.GetBytes(new FileInfo(filePath).Length).CopyTo(length, 0);
stream.Write(length, 0, 8);

//发送文件
while ((readLength = fs.Read(data, 0, blockLength)) > 0)
{
stream.Write(data, 0, readLength);
}
}

}

public bool ReceiveFile(string fileName, NetworkStream stream) //接收文件
{
try
{
long count = GetSize(stream);
if (count == 0)
{
return false;
}
long index = 0;
int currentBlockLength = 0;
int receivedBytesLen = 1;
using (FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate))
{
while (receivedBytesLen > 0 && index < count)
{
byte[] clientData = new byte[blockLength];
receivedBytesLen = 0;

if (blockLength < count - index)
{
currentBlockLength = blockLength;
}
else
{
currentBlockLength = (int)(count - index);
}
receivedBytesLen = stream.Read(clientData, 0, currentBlockLength);
fs.Write(clientData, 0, receivedBytesLen);
index += receivedBytesLen;
}
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
return false;
}
return true;
}

private int GetSize(NetworkStream stream) //获取文件大小
{
int count = 0;
byte[] countBytes = new byte[8];
try
{
if (stream.Read(countBytes, 0, 8) == 8)
{
count = BitConverter.ToInt32(countBytes, 0);
}
else
{
return 0;
}
}
catch
{
return 0;
}
return count;
}
</code>

热点排行