2016-11-18 5 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. Тогда о п на сторону клиента, я отправить сообщение из формы окна, и событие нажатия кнопки делает это:

    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 ... Пожалуйста, кто-нибудь мне поможет или скажите, где ошибка.

* Я говорю по желанию, потому что 1. и 2. шаги в порядке (по крайней мере, я думаю)

+0

Вы должны передать 'bytesFrom.Length' вместо' clientSocket.ReceiveBufferSize' в 'networkStream.Read'. –

+0

Каково значение 'clientSocket.ReceiveBufferSize'? –

ответ

3

С MSDN, ArgumentOutOfRangeException означает, что смещение или количество отрицателен (2-й и 3-й параметры), Или параметр «размер (счетчик)» больше длины буфера минус значение параметра «смещение».

Прошу пропустить bytesFrom.Length в отличие от clientSocket.ReceiveBufferSize.

Смежные вопросы