为什么我不能在C#中从TcpClient读取字节?

问题描述

为什么我不能在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,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()方法可以很好地完成。即它开始,然后等待请求,获取请求,写入TclClient,最后运行server.Stop();命令。

我希望我的代码能够正常工作,因为我从here上获取并修改了官方文档。

我试图检查一些可以解决我的异常情况的资源,但是它们都没有帮助。

例如我尝试使用the问题。

第一个答案实际上并没有说出什么有用的信息,而只是玩弄单词,最后说一个人对异常无能为力(请回答我,如果我在答案中遗漏了一点)。

第二个答案告诉我一个不可能的问题。因为,我敢肯定13000端口上没有任何运行。

解决方法

您的客户代码正在使用HttpClient,该代码发送HTTP请求并期望HTTP响应。但是您的服务器不是HTTP服务器,它只是一个普通的TCP服务器,因此当客户端未收到格式正确的HTTP响应时,客户端很可能会失败并强制关闭连接。

您修改了示例的“官方文档”根本没有使用HttpClient,而是使用了TcpClient

如果要在客户端中使用HttpClient,则应在服务器中使用HttpListener而不是TcpListener

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...