TcpClient创建似乎非常慢。我能缓存那些吗?

时间:2011-06-18 22:40:42

标签: c# sockets tcpclient

我有程序,客户端通过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 = new TcpClient(hostName,   PORTNUMBER);

对于某些机器来说,

有时会非常慢。例如,在我的家庭网络中,它需要2或3秒。你能看出15个客户的真实情况吗?

我想知道有多贵或者甚至可能不会每次关闭客户并始终保持30-40个开放?我假设一些机制来检查以确保它们存活并确保它们都正确关闭需要编码,但我想知道这个想法本身是否正确..

谢谢!

1 个答案:

答案 0 :(得分:1)

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

操作系统可能会限制每秒挂起的连接数(在Windows下每秒10次)但除此之外不应该有任何问题。在我看来,你不应该打开/关闭单个命令的连接。您应该考虑保持畅通,TcpClient以及StreamWriter。只需确保在编写完数据包后进行刷新。为了提高性能,您应该考虑手动刷新,特别是如果要向每个客户端发送多个命令/数据包,因为每个数据包将采用最小TCP窗口大小(通常大约为1492-1500字节)。