NetworkStream.Read() 不起作用并抛出 ArgumentOutOfRangeException

Ped*_*rdo 1 c# sockets tcp chat client-server

只是想创建一个聊天服务器客户端

  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");
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后,客户端连接到服务器(可选)*

        System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();
        clientSocket.Connect("127.0.0.1", 8888);
    
    Run Code Online (Sandbox Code Playgroud)
  3. 然后,在客户端,我从 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();
    
    Run Code Online (Sandbox Code Playgroud)
  4. 最后,在服务器端,一个无限的客户端请求。这就是我在 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());
            }
        }
    
    Run Code Online (Sandbox Code Playgroud)

我一步一步调试(在服务器和客户端上),一切都很好,直到我到达 networkStream.Read() 方法,并抛出 ArgumentOutOfRangeException ......请任何人帮助我或告诉我错误在哪里。

*我说可选是因为 1. 和 2. 步骤很好(至少,我认为)

tec*_*ice 5

MSDN来看,ArgumentOutOfRangeException 表示偏移计数为负(第二个和第三个参数),或者“size(count)”参数大于缓冲区长度减去“offset”参数的值。

我会尝试通过bytesFrom.Length而不是clientSocket.ReceiveBufferSize.