TcpListener 读请求返回-1

TcpListener reading request returning -1

我正在使用 TcpListener 这样的:

TcpListener _listener;

public void Start()
{
    _listener = new TcpListener(IPAddress.Any, 8000);
    _listener.Start();
    _listener.BeginAcceptSocket(this.HandleAcceptTcpClient, _listener);
}

private void HandleAcceptTcpClient(IAsyncResult result)
{
    TcpClient client = _listener.EndAcceptTcpClient(result);
    _listener.BeginAcceptTcpClient(HandleAcceptTcpClient, _listener);

    Console.WriteLine("Accepting connection...");

    NetworkStream stream = client.GetStream();

    using (StreamWriter writer = new StreamWriter(stream, Encoding.ASCII))
    using (StreamReader reader = new StreamReader(stream, Encoding.ASCII))
    {
        char c;
        while ((c = (char)reader.Read()) != 0)
        {
            Console.Write(c);
        }
        Console.WriteLine();
    }
}

当我在 Chrome 中向 localhost:8000 发出请求时,我在控制台中得到以下响应(? 是无穷无尽的):

当我将 HandleAcceptTcpClient 中的代码更改为此(更改为打印整数而不是字符)时:

private void HandleAcceptTcpClient(IAsyncResult result)
{
    TcpClient client = _listener.EndAcceptTcpClient(result);
    _listener.BeginAcceptTcpClient(HandleAcceptTcpClient, _listener);

    Console.WriteLine("Accepting connection...");

    NetworkStream stream = client.GetStream();

    using (StreamWriter writer = new StreamWriter(stream, Encoding.ASCII))
    using (StreamReader reader = new StreamReader(stream, Encoding.ASCII))
    {
        // the changes are on the next 5 lines
        int i;
        while ((i = reader.Read()) != 0)
        {
            Console.Write(i);
        }
        Console.WriteLine();
    }
}

我得到以下信息:

所以基本上,浏览器似乎在发出另一个请求并且只发送 -1;另外,做 reader.ReadToEnd() 只是挂起,这意味着它是无止境的。

有什么想法吗?

它不是Chrome发送另一个请求。 returns -1 似乎是 Stream.ReadByte 方法,因为它到达了流的末尾。

MSDN:

Return Value: The unsigned byte cast to an Int32, or -1 if at the end of the stream.

因此,如果 StreamReader 使用输入流的 Stream.ReadByte 方法从中读取数据,则输出有意义。