为了学习目的(我想牢牢掌握HTTP内部),我正在编写简单的HTTP服务器,它将根据7235 7230-7235解析请求并将其代理到我的简单后端服务器。
我并不想击败任何现有的解决方案,但显然TCPClient由于某些原因而工作非常缓慢。在更糟糕的情况下,直接调用我的后端只需要20 my,而使用我的简单服务器调用它至少需要200 my,这太糟糕了。
撇开解析不谈,这对响应时间几乎没有什么影响,这是一种最低限度的代码,它将接收响应并将其发送到后端:
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();
}
}我不知道这是否重要,但我的环境看起来是这样的:
在我的最小代码示例中,每个请求都需要200到250 my,至少在我的机器上是这样。这与我的实际代码工作方式并没有太大的不同。最大的区别可能是,我为每个请求发送垃圾邮件任务,而且我有很多与RFC需求相关的验证。
如果在如何正确使用TCPClient (或必要时使用套接字)方面有一些很好的资源,那么我很乐意接受它。
发布于 2021-12-18 20:07:22
好吧,显然答案是.令人不安..。
我通过将对http://localhost:port的调用改为http://127.0.0.1:port来解决这个问题。
现在,即使是我在本例中的代理实现,最小的代码也只需几毫秒即可运行。
似乎windows上的本地主机解决方案存在某种问题,老实说,这超出了我的能力范围。显然,帮助我的不仅仅是我的问题,一些reddit (帖子)的用户在试图运行类似于我的代码时也遇到了同样的问题。
https://stackoverflow.com/questions/70402719
复制相似问题