TcpClient的创建似乎非常缓慢.我可以缓存这些吗

本文关键字:缓存 我可以 缓慢 非常 创建 TcpClient | 更新日期: 2023-09-27 17:59:49

我有一个程序,客户端对等端通过TCP-IP相互通信。当一个客户做某事时,他会一个接一个地向其他客户发出信号,表示发生了这种情况。以下是我用来发送数据的代码:

public static string SendDirect(string data, string hostName, int portNumber)
        {
            string responseData;
            try
            {
                var client = new TcpClient(hostName, portNumber);
                Stream s = client.GetStream();
                var sw = new StreamWriter(s) { AutoFlush = true };
                sw.WriteLine(data);
                s.Close();
                client.Close();
                s.Dispose();
                sw.Dispose();
                responseData = "OK";
            }
            catch (SocketException ex)
            {
                responseData = ex.Message;
            }
            return responseData;
        }

线路

var client=新的TcpClient(hostName,portNumber);

对于某些机器来说有时可能非常慢。例如,在我的家庭网络中,它大约需要2或3秒。你能看到有15个客户真的很糟糕吗。

我想知道,如果每次都不关闭客户端,并始终保持30-40个客户端的开放状态,成本有多高,甚至可能有多高?我认为需要对一些机制进行编码,以确保它们活着,并确保它们都正确关闭,但我想知道这个想法本身是否正确。。

谢谢!

TcpClient的创建似乎非常缓慢.我可以缓存这些吗

没有什么可以阻止或限制您一次创建多个客户端/连接。实际上,启动和关闭大量连接可能会触发不同的安全措施(试图抵御可能的DDOS攻击或其他什么)。您还可以加快之前解析主机名并缓存这些主机名的过程。实际上,不一定是对象创建减慢了速度。

操作系统可能会限制每秒挂起的连接数(想想Windows下的每秒10个),但除此之外,应该不会有任何问题。在我看来,无论如何都不应该为单个命令打开/关闭连接。您应该考虑保持两者都打开,TcpClientStreamWriter。只要确保你在写完你的包后脸红就行了。为了提高性能,您应该考虑手动刷新,尤其是当有多个命令/数据包要发送到每个客户端时,因为每个数据包将占用最小的TCP窗口大小(通常约为1492-1500字节)。