首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TCPClient性能极慢

TCPClient性能极慢
EN

Stack Overflow用户
提问于 2021-12-18 10:42:27
回答 1查看 382关注 0票数 0

为了学习目的(我想牢牢掌握HTTP内部),我正在编写简单的HTTP服务器,它将根据7235 7230-7235解析请求并将其代理到我的简单后端服务器。

我并不想击败任何现有的解决方案,但显然TCPClient由于某些原因而工作非常缓慢。在更糟糕的情况下,直接调用我的后端只需要20 my,而使用我的简单服务器调用它至少需要200 my,这太糟糕了。

撇开解析不谈,这对响应时间几乎没有什么影响,这是一种最低限度的代码,它将接收响应并将其发送到后端:

代码语言:javascript
复制
public static async Task Main()
{
    Logger.Info("Start listener.");
    var listener = new TcpListener(IPEndPoint.Parse("0.0.0.0:5000"));
    listener.Start();

    while (true)
    {
        var client = await listener.AcceptTcpClientAsync();

        using var c_stream = client.GetStream();

        // read request
        using var ms = new MemoryStream();
        int i;
        var buffer = new byte[1024];
        while ((i = await c_stream.ReadAsync(buffer, 0, 1024)) != 0)
        {
            await ms.WriteAsync(buffer, 0, i);
            if (i < 1024) break;
        }

        // write whole request as-is to backend
        using var backend = new TcpClient();
        await backend.ConnectAsync(IPEndPoint.Parse("172.21.215.119:3000"));
        var b_stream = backend.GetStream();

        ms.Position = 0;
        ms.WriteTo(b_stream);
        await b_stream.FlushAsync();

        // read output from backend to memory
        ms.Position = 0;
        while ((i = await b_stream.ReadAsync(buffer, 0, 1024)) != 0)
        {
            await ms.WriteAsync(buffer, 0, i);
            if (i < 1024) break;
        }

        // send back to fuckin client
        ms.Position = 0;
        ms.WriteTo(c_stream);
        await c_stream.FlushAsync();
    }
}

我不知道这是否重要,但我的环境看起来是这样的:

  1. 我正在用WSL 2在windows 10机器上工作。
  2. 后端是在WSL (ubuntu)上设置的。只是巢上的宠物店。
  3. 后端调用mongodb,它是在docker环境中设置的(也是WSL)。

在我的最小代码示例中,每个请求都需要200到250 my,至少在我的机器上是这样。这与我的实际代码工作方式并没有太大的不同。最大的区别可能是,我为每个请求发送垃圾邮件任务,而且我有很多与RFC需求相关的验证。

如果在如何正确使用TCPClient (或必要时使用套接字)方面有一些很好的资源,那么我很乐意接受它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-18 20:07:22

好吧,显然答案是.令人不安..。

我通过将对http://localhost:port的调用改为http://127.0.0.1:port来解决这个问题。

现在,即使是我在本例中的代理实现,最小的代码也只需几毫秒即可运行。

似乎windows上的本地主机解决方案存在某种问题,老实说,这超出了我的能力范围。显然,帮助我的不仅仅是我的问题,一些reddit (帖子)的用户在试图运行类似于我的代码时也遇到了同样的问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70402719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档