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 方法从中读取数据,则输出有意义。
我正在使用 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 方法从中读取数据,则输出有意义。