C# NetStream
标题:NetStream
关注点:Read、Write
正文:
int size = Read(buf, 0, buf.length);
这里一次会读入length个字节,如果小于这个数量,后面的就是垃圾数据,我当时被这个搞懵了,看了两天才找出问题,我是直接读入到buf,然后通过Encoding.Default.GetString(buf)得到字符串的,结果半天没发现问题,输出时显示也正常(...),其实字符串的长度是buf.length,只有当取出字符串的长度时才发现异常!Read的返回值表示实际读入的数据数量,之后可以调用Encoding.Default.GetString(buf, 0, size);得到正确的字符串。
现在新的问题出现,如果对方write的数据大于这个值,后面的就会停在缓冲区,等待下次的接收,这里很可能又会出问题(一次发送的一次解决,特别是在开头加上控制字符的情况下)。所以我们可以判断,如果size == buf.length,那么就继续接收,然后多次接收的结果组合到一起。但是对方发送的数据正好的buf.length大小就会出错,因此双方可以规定如果发送的数据是buf.length的整数倍,那么后面加上"#END"再进行发送,而接收方收到单独的#END就也表示一次读入结束。
1 class MyNetStream 2 { 3 public const int MAX = 5; 4 NetworkStream stream; 5 public MyNetStream(NetworkStream stream) 6 { 7 this.stream = stream; 8 } 9 public string Read() 10 { 11 string ret = ""; 12 byte[] buf = new byte[MAX]; 13 int size; 14 do 15 { 16 size = stream.Read(buf, 0, buf.Length); 17 string s = Encoding.Default.GetString(buf, 0, size); 18 Console.Write(s + "size = " + size); 19 if (!s.Equals("#END")) ret += s; 20 else break; 21 } while (size == MAX); 22 return ret; 23 } 24 public void Write(string s) 25 { 26 byte[] buf = Encoding.Default.GetBytes(s); 27 if(buf.Length % MAX == 0) 28 { 29 buf = Encoding.Default.GetBytes(s + "#END"); 30 } 31 stream.Write(buf, 0, buf.Length); 32 } 33 }