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个客户端的开放状态,成本有多高,甚至可能有多高?我认为需要对一些机制进行编码,以确保它们活着,并确保它们都正确关闭,但我想知道这个想法本身是否正确。。
谢谢!
没有什么可以阻止或限制您一次创建多个客户端/连接。实际上,启动和关闭大量连接可能会触发不同的安全措施(试图抵御可能的DDOS攻击或其他什么)。您还可以加快之前解析主机名并缓存这些主机名的过程。实际上,不一定是对象创建减慢了速度。
操作系统可能会限制每秒挂起的连接数(想想Windows下的每秒10个),但除此之外,应该不会有任何问题。在我看来,无论如何都不应该为单个命令打开/关闭连接。您应该考虑保持两者都打开,TcpClient
和StreamWriter
。只要确保你在写完你的包后脸红就行了。为了提高性能,您应该考虑手动刷新,尤其是当有多个命令/数据包要发送到每个客户端时,因为每个数据包将占用最小的TCP窗口大小(通常约为1492-1500字节)。