zoukankan      html  css  js  c++  java
  • 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   }
  • 相关阅读:
    static变量的生命周期
    关于C++的new是否会对内存初始化的问题
    行列式的本质是什么?
    C++本质:类的赋值运算符=的重载,以及深拷贝和浅拷贝
    C++拷贝(复制)构造函数详解
    随机生成指定长度字符字符串(C语言实现)
    【npm】npm install的报错
    【HTTP】http请求url参数包含+号,被解析为空格
    【ngx-ueditor】百度编辑器按下Shift键不触发contentChange事件
    【Angular】No component factory found for ×××.
  • 原文地址:https://www.cnblogs.com/hchlqlz-oj-mrj/p/6190672.html
Copyright © 2011-2022 走看看