2016-11-18 116 views
0

只是想創建一個聊天服務器 - 客戶端NetworkStream.Read()不工作,並拋出ArgumentOutOfRangeException

  1. 這是等待客戶端連接服務器(可選)*

    TcpListener serverSocket = new TcpListener(8888); 
        int requestCount = 0; 
        TcpClient clientSocket = default(TcpClient); 
        serverSocket.Start(); 
        Console.WriteLine(" >> Server Started"); 
        clientSocket = serverSocket.AcceptTcpClient(); 
        Console.WriteLine(" >> Accept connection from client"); 
    
  2. 然後,客戶端連接到服務器(可選)*

    System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient(); 
        clientSocket.Connect("127.0.0.1", 8888); 
    
  3. 然後,鄰n中的客戶端,我從Windows窗體發送消息,以及按鈕單擊事件做到這一點:

    NetworkStream serverStream = clientSocket.GetStream(); 
    byte[] outStream = System.Text.Encoding.ASCII.GetBytes(textBox2.Text + "$"); 
    serverStream.Write(outStream, 0, outStream.Length); 
    serverStream.Flush(); 
    //this goes to the server ------> to the part (4) 
    
    //returning from the server <------ 
    byte[] inStream = new byte[10025]; 
    serverStream.Read(inStream, 0, (int)clientSocket.ReceiveBufferSize); 
    string returndata = System.Text.Encoding.ASCII.GetString(inStream); 
    textBox2.Text = ""; 
    textBox2.Focus(); 
    
  4. 最後,在服務器端,客戶端請求無限bucle。而這裏是我上了networkStream.Read()

    while ((true)) 
        { 
         try 
         { 
          requestCount = requestCount + 1; 
          NetworkStream networkStream = clientSocket.GetStream(); 
          byte[] bytesFrom = new byte[10025]; 
          if (networkStream.DataAvailable) 
          { 
           **networkStream.Read(bytesFrom, 0, (int) clientSocket.ReceiveBufferSize);** 
           string dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom); 
           dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$")); 
           Console.WriteLine(" >> Data from client - " + dataFromClient); 
           string serverResponse = "Last Message from client" + dataFromClient; 
           Byte[] sendBytes = Encoding.ASCII.GetBytes(serverResponse); 
           networkStream.Write(sendBytes, 0, sendBytes.Length); 
           networkStream.Flush(); 
           Console.WriteLine(" >> " + serverResponse); 
          } 
         } 
         catch (Exception ex) 
         { 
          Console.WriteLine(ex.ToString()); 
         } 
        } 
    

我調試一步一步(服務器和客戶端)的問題,這一切都正常,直到我到達networkStream.Read( )方法,並引發ArgumentOutOfRangeException ...請有人幫助我或告訴我錯誤在哪裏。

* I說可選的,因爲1和2的步驟是細(至少,我認爲)

+0

您應該將'bytesFrom.Length'而不是'clientSocket.ReceiveBufferSize'傳遞給'networkStream.Read'。 –

+0

'clientSocket.ReceiveBufferSize'的值是什麼? –

回答

3

MSDN,ArgumentOutOfRangeException意味着偏移計數是否定的(第二和第三參數),或者「size(count)」參數大於緩衝區的長度減去「offset」參數的值。

我想嘗試通過bytesFrom.Length而不是clientSocket.ReceiveBufferSize

相關問題