標題: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 }