如何用Socket传递大量数据
Sunday, August 27, 2006 2:40:21 PM
最近编写的一个Server/Client程序,需要首先在Server和Client之间建立一个Socket连接(TCP),然后通过这个连接传送大量数据,可是每次都无法接收到完整的数据,导致程序无法正常运行。
接收数据的代码如下:
经过调试发现这段代码在04行很容易得到bytes=0的结果,然后就跳出接收循环了,而这个时候数据还没有接收完整。测试了各种方法,都没有很好的解决这个问题,于是坐下来好好分析这块的问题:
导致问题的原因是Socket接收缓冲区中已经没有可读数据了,而这个时候新的数据还没有发送过来,因此bytes就等于0了。只要我们有办法让接收程序在收完所有数据之后才跳出,就可以解决这个问题了。
为了实现这点,我们需要改进一下逻辑:
利用上面的方法,我很好的解决了用Socket传递大量数据的问题,看来解决之道并非技术,而是思路。
接收数据的代码如下:
01 byte[] buf = new byte[1024];
02 int bytes;
03 MemoryStream ms = new MemoryStream();
04 while((bytes = sock.Receive(buf, 0, buf.Length, SocketFlags.None) > 0) {
05 ms.Write(buf, 0, bytes);
06 }
07 byte[] response = ms.ToArray();
经过调试发现这段代码在04行很容易得到bytes=0的结果,然后就跳出接收循环了,而这个时候数据还没有接收完整。测试了各种方法,都没有很好的解决这个问题,于是坐下来好好分析这块的问题:
导致问题的原因是Socket接收缓冲区中已经没有可读数据了,而这个时候新的数据还没有发送过来,因此bytes就等于0了。只要我们有办法让接收程序在收完所有数据之后才跳出,就可以解决这个问题了。
为了实现这点,我们需要改进一下逻辑:
发送端:
int size = buf.Length;
sock.Send(BitConverter.GetBytes(size));
sock.Send(buf);
接收端:
byte buf = new byte[4];
sock.Receive(buf, 0, 4, SocketFlags.None);
int size = BitConverter.ToInt32(buf, 0);
buf = new byte[1024];
int len = 0, bytes;
MemoryStream ms = new MemoryStream();
while(len < size) {
bytes = sock.Receive(buf, 0, buf.Length, SocketFlags.None);
ms.Write(buf, 0, bytes);
len += bytes;
}
byte[] response = ms.ToArray();
利用上面的方法,我很好的解决了用Socket传递大量数据的问题,看来解决之道并非技术,而是思路。
