2012-11-09 73 views
2

無法找到這個在stackoverflow上,我確實有一個它的例子,我寫了幾個月前,但現在找不到。C#讀取一個字節[]並刪除垃圾數據

基本上我從客戶端向服務器發送byte [],在服務器窗口中顯示它,然後計劃對其中的數據進行操作。其中我收到的數據,但是,不被清洗每一次,例如:

我送「ABCDEF」 服務器顯示「ABCDEF」 我送「GHI」 服務器顯示「GHIDEF」

我想你可以看到我來自哪裏,我只需要一個清理byte []數組的方法,就這一方面而言。

下一步就是隻讀取我打算使用的字節,所以儘管我只使用了X數據量,但實際上我正在接收比我需要的更多的數據,我現在需要在最後處理額外的數據。

任何人都可以告訴我如何去做這件事嗎?

我的代碼如下。

客戶:

static void Main(string[] args) 
    { 

     try 
     { 
      ASCIIEncoding encoding = new ASCIIEncoding(); 
      Console.WriteLine("Welcome to Josh's humble server."); 
      IPEndPoint ipEnd = new IPEndPoint(IPAddress.Any, 2000); 
      Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); 
      sock.Bind(ipEnd); 
      sock.Listen(100); 
      Socket clientSock = sock.Accept(); 
      byte[] mabytes = encoding.GetBytes("Test"); 
      clientSock.Send(mabytes); 
      Console.WriteLine("Hmmm, data sent!"); 
      Console.ReadLine(); 
      Console.WriteLine(encoding.GetString(mabytes)); 
      Console.ReadLine(); 
      byte[] buffer = encoding.GetBytes("server message"); 
      while (true) 
      { 
       clientSock.Receive(buffer); 
       Console.WriteLine(encoding.GetString(buffer)); 
      } 


     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(Convert.ToString(ex)); 
      Console.ReadLine(); 
     } 

    } 

服務器:

static void Main(string[] args) 
    { 
     ASCIIEncoding encoding = new ASCIIEncoding(); 
     IPAddress ip = IPAddress.Parse("127.0.0.1"); 
     Console.WriteLine("Welcome to Josh's humble client."); 
     Console.ReadLine(); 
     IPEndPoint ipEnd = new IPEndPoint(ip, 2000); 
     Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); 
     sock.Connect(ipEnd); 
     while (true) 
     { 
      Console.WriteLine("Please enter a message:\n"); 
      byte[] mabyte = encoding.GetBytes(Console.ReadLine()); 
      sock.Send(mabyte); 
      Console.WriteLine("Sent Data"); 
     } 
    } 

在此先感謝

+3

我相信你有你的客戶端和服務器代碼塊倒退。請相應地編輯以避免混淆。 –

回答

5

您使用clientSock.Receive(buffer);獲取數據,但從來沒有檢查返回值。它可能小於緩衝區的長度。更正確的方法可以是:

int len = clientSock.Receive(buffer); 
Console.WriteLine(encoding.GetString(buffer,0,len)); 

而且使用byte[] buffer = encoding.GetBytes("server message");分配字節是不是一個好辦法。當多字節字符被分裂之間連續讀 使用類似byte[] buffer = new byte[1024*N];

- 編輯 -

即使這種做法是有問題的。 一個更好的方式可以使用TcpClient,包裝它的流new StreamReader(tcpClient.GetStream())並逐行閱讀

+0

要進一步瞭解這一點,請閱讀http://msdn.microsoft.com/en-us/library/8s4y8aff.aspx Receive的返回值是讀取的長度。 –

+0

謝謝,我已經清理了緩衝區(爲while語句的每次運行聲明瞭一個新的緩衝區),並將長度選項添加到了getstring,你能告訴我0是什麼意思,但我知道它是byteIndex,是不是意味着實際數據的開始還是什麼? – XtrmJosh

+0

不,你的緩衝區每次從'0'索引開始填充。編碼將使用'count'字節從'byteindex'(在你的情況下爲'0')形成一個字符串。 –