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   }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章