为什么我不能从 C# 中的 TcpClient 读取字节?
Why can not I read bytes from the TcpClient in C#?
为什么我不能从 C# 中的 TcpClient 读取字节?
这是我收到的错误:
Unable to read data from the transport connection: An established connection was aborted by the software in your host machine.
以下是我启动 TcpClient 的方式:
public static async void Start()
{
TcpListener server = null;
try
{
server = new TcpListener(IPAddress.Loopback, 13000);
server.Start();
var client = await server.AcceptTcpClientAsync();
var stream = client.GetStream();
var bytes = Convert.FromBase64String("ABCD");
await stream.WriteAsync(bytes, 0, bytes.Length);
client.Close();
}
catch (Exception e)
{
throw;
}
finally
{
if(server != null)
{
server.Stop();
}
}
}
下面是我如何 运行 向 TcpClient 发出请求:
try {
var response = (new HttpClient()).GetByteArrayAsync("http://localhost:13000").Result;
return Convert.ToBase64String(response);
} catch(Exception e) {
throw;
}
从未到达 return Convert.ToBase64String(response);
行。当我在 Exception e
中看到上面引用的错误消息时,如果我在 throw
行上遇到断点。
此外,在调试期间 Start()
方法完成得很好。 IE。它启动,然后等待请求,获取请求,写入 TclClient,最后 运行s server.Stop();
命令。
我希望我的代码能够工作,因为我在 here 上从官方文档中获取并修改了它。
我尝试查看一些可以解决我的异常的资源,但 none 确实有帮助。
例如我尝试使用 the 问题。
第一个答案实际上没有提供任何有用的信息,只是玩弄文字,并在最后声明对异常无能为力(如果我在答案中遗漏了一点,请纠正我)。
第二个答案告诉我一个不可能的问题。因为,我确定13000端口上没有运行ning。
您的客户端代码正在使用 HttpClient
,它发送一个 HTTP 请求并期望一个 HTTP 响应。但是你的服务器不是 HTTP 服务器,它只是一个普通的 TCP 服务器,所以当客户端没有收到正确格式的 HTTP 响应时,它很可能会失败并强行关闭连接。
您修改其示例的“官方文档”根本没有使用HttpClient
,而是使用TcpClient
。
如果您想在客户端使用 HttpClient
,那么您应该在服务器中使用 HttpListener
而不是 TcpListener
。
为什么我不能从 C# 中的 TcpClient 读取字节?
这是我收到的错误:
Unable to read data from the transport connection: An established connection was aborted by the software in your host machine.
以下是我启动 TcpClient 的方式:
public static async void Start()
{
TcpListener server = null;
try
{
server = new TcpListener(IPAddress.Loopback, 13000);
server.Start();
var client = await server.AcceptTcpClientAsync();
var stream = client.GetStream();
var bytes = Convert.FromBase64String("ABCD");
await stream.WriteAsync(bytes, 0, bytes.Length);
client.Close();
}
catch (Exception e)
{
throw;
}
finally
{
if(server != null)
{
server.Stop();
}
}
}
下面是我如何 运行 向 TcpClient 发出请求:
try {
var response = (new HttpClient()).GetByteArrayAsync("http://localhost:13000").Result;
return Convert.ToBase64String(response);
} catch(Exception e) {
throw;
}
从未到达 return Convert.ToBase64String(response);
行。当我在 Exception e
中看到上面引用的错误消息时,如果我在 throw
行上遇到断点。
此外,在调试期间 Start()
方法完成得很好。 IE。它启动,然后等待请求,获取请求,写入 TclClient,最后 运行s server.Stop();
命令。
我希望我的代码能够工作,因为我在 here 上从官方文档中获取并修改了它。
我尝试查看一些可以解决我的异常的资源,但 none 确实有帮助。
例如我尝试使用 the 问题。
第一个答案实际上没有提供任何有用的信息,只是玩弄文字,并在最后声明对异常无能为力(如果我在答案中遗漏了一点,请纠正我)。
第二个答案告诉我一个不可能的问题。因为,我确定13000端口上没有运行ning。
您的客户端代码正在使用 HttpClient
,它发送一个 HTTP 请求并期望一个 HTTP 响应。但是你的服务器不是 HTTP 服务器,它只是一个普通的 TCP 服务器,所以当客户端没有收到正确格式的 HTTP 响应时,它很可能会失败并强行关闭连接。
您修改其示例的“官方文档”根本没有使用HttpClient
,而是使用TcpClient
。
如果您想在客户端使用 HttpClient
,那么您应该在服务器中使用 HttpListener
而不是 TcpListener
。