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   }
  • 相关阅读:
    LeetCode "Median of Two Sorted Arrays"
    LeetCode "Distinct Subsequences"
    LeetCode "Permutation Sequence"

    LeetCode "Linked List Cycle II"
    LeetCode "Best Time to Buy and Sell Stock III"
    LeetCode "4Sum"
    LeetCode "3Sum closest"
    LeetCode "3Sum"
    LeetCode "Container With Most Water"
  • 原文地址:https://www.cnblogs.com/hchlqlz-oj-mrj/p/6190672.html
Copyright © 2011-2022 走看看