【问题标题】:Should I close a socket (TCPIP) after every transaction?每次交易后我应该关闭一个套接字(TCPIP)吗?
【发布时间】:2010-09-16 05:53:21
【问题描述】:

我编写了一个 TCPIP 服务器,它实现了 FileSystemWatcher,并用从 FSW 获取的新文件解析的数据填充队列。

单个客户端将连接到此服务器并从队列中请求数据(任何其他客户端都不需要连接)。如果不存在数据,客户端将等待(1 秒)然后重试。

客户端和服务器都是异步编写的 - 我的问题是:客户端应该为每个事务创建一个新的套接字(在 while 循环内),还是让套接字保持打开状态(在 while 循环外)?

client.Connect()

while(bCollectData)
{
    ... communicate ...

    Thread.Sleep(1000);
}

client.Shutdown(SocketShutdown.Both);
client.Close();

【问题讨论】:

    标签: c# sockets tcp


    【解决方案1】:

    我建议你让套接字保持打开状态,甚至最好在服务器上阻止它,这样你就不必执行 Thread.Sleep。当服务器有一些数据时,他会将消息发送给客户端。

    代码看起来像这样

    while(bCollectData)
    {
       _socket.recv(...); //this line will wait for response from server
       //... process message and start another wait in the next iteration.
    }
    

    使用这种方法,您将立即获得所有消息,并避免在客户端和服务器之间发送不需要的消息(返回该服务器的消息没有数据)。

    【讨论】:

      【解决方案2】:

      我会让套接字在循环之外保持打开状态,每次迭代都重新连接似乎是在浪费资源。

      【讨论】:

        【解决方案3】:

        我不会关闭套接字。每次连接时,您都会握手。

        【讨论】:

          猜你喜欢
          • 2017-11-05
          • 2013-02-07
          • 1970-01-01
          • 1970-01-01
          • 2019-08-15
          • 2012-06-18
          • 1970-01-01
          • 2020-08-19
          • 1970-01-01
          相关资源
          最近更新 更多