Я не стремлюсь превзойти какое-либо существующее решение, но, очевидно, TCPClient по какой-то причине работает очень медленно. В худшем случае прямой вызов моего бэкэнда занял бы всего 20 мс, тогда как вызов с использованием моего простого сервера занял бы не менее 200 мс, что ужасно.
Не считая синтаксического анализа, который практически не влияет на время ответа, это минимальный код, который принимает ответ и отправляет его на бэкэнд как есть:
Код: Выделить всё
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();
}
}
- Я работаю на компьютере под управлением Windows 10 с WSL 2.
- Бэкенд настроен на WSL (ubuntu). Это просто зоомагазин наnesjs.
- Бэкенд вызывает mongodb, который настроен в среде докера (также WSL).
Если есть хорошие ресурсы о том, как правильно использовать TCPClient (или сокеты, если необходимо), то я бы с радостью воспользовался ими.
Подробнее здесь: https://stackoverflow.com/questions/704 ... -tcpclient
Мобильная версия