My Opera is closing 3rd of March

对于Webus的重新理解

一切源于引擎

Subscribe to RSS feed

如何用Socket传递大量数据

最近编写的一个Server/Client程序,需要首先在Server和Client之间建立一个Socket连接(TCP),然后通过这个连接传送大量数据,可是每次都无法接收到完整的数据,导致程序无法正常运行。

接收数据的代码如下:

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传递大量数据的问题,看来解决之道并非技术,而是思路。
March 2014
S M T W T F S
February 2014April 2014
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31