C# NetStream

标题:NetStreamthis

关注点:Read、Writespa

正文:code

  int size = Read(buf, 0, buf.length);blog

  这里一次会读入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就也表示一次读入结束。 string

 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   }
相关文章
相关标签/搜索