我有一台TCP服务器从一个(也是唯一一个)客户端获取数据。当此客户端发送数据时,它会建立与我的服务器的连接,发送一条(逻辑)消息,然后不再发送该连接。
然后它将发出另一个连接以发送下一条消息。
我有一位同事说,从资源的角度来看,这是非常糟糕的。他说建立连接是资源密集型的,需要一段时间。他说我需要让这个客户端建立连接,然后只要我们需要进行通信(或直到出现错误)就继续使用它。
使用单独连接的一个好处是我可以多线程连接它们并获得更多的吞吐量。我向同事提到了这一点,他告诉我,打开很多套接字会杀死服务器。
这是真的吗?或者我可以只允许它为每个需要发送的逻辑消息建立单独的连接。 (请注意,逻辑消息我指的是一个可变长度的xml文件。)
答案 0 :(得分:1)
TCP连接的启动顺序是一种非常简单的3路握手,其开销非常低。无需保持持续的连接。
同样拥有多个TCP连接也不会如此快速地杀死您的服务器。现代硬件和操作系统可以处理数百个连续的TCP连接,除非您害怕拒绝服务攻击,这显然超出了这个问题的范围。
答案 1 :(得分:1)
如果您的服务器只有一个客户端,我无法想象在实践中每个消息打开一个新的TCP套接字会有任何问题。听起来你的同事喜欢过早优化。
但是,如果您使用邮件充斥服务器,则可能会出现问题。但是,对于一个客户,我不会担心它。
确保在完成后关闭套接字。无需对服务器粗鲁:)
答案 2 :(得分:1)
除了大家所说的,还要考虑UDP。它非常适合没有预期响应的小消息,而且在本地网络(而不是Internet)上它实际上是可靠的。
答案 3 :(得分:1)
从服务器的角度来看,打开大量连接并不是问题。
How many socket connections can a web server handle?
从客户端的角度来看,如果测量显示需要以避免时间启动连接而您希望并行,则可以创建连接池。多个线程可以重复使用每个连接,并在完成后将它们释放回池中。这确实提高了复杂程度,所以再次确保你需要它。您还可以根据活动缩小和扩展池的逻辑 - 当应用程序闲置时,将连接打开到服务器是非常糟糕的。
答案 4 :(得分:1)
这完全取决于您打算打开和关闭的连接数以及打算打开它们的速率。
除非您通过中止连接而不是优雅地关闭它来避免TIME_WAIT
状态,否则您将在客户端或服务器上累积TIME_WAIT
状态的套接字。对于单个客户而言,实际上并不重要,因为问题将是相同的。如果您使用连接的速率比TIME_WAIT
连接关闭的速度快,那么您最终将无法打开任何新连接的点,因为您没有剩余的短暂端口正在使用TIME_WAIT
中的套接字。
一般情况下,我建议您保留一个连接,如果重置则只需重新打开即可。逻辑可能看起来有点复杂,但系统会更好地扩展;您现在可能只有一个客户端,并且连接速率可能会使您不希望遇到TIME_WAIT
个问题,但这些事实可能在您的系统生命周期中保持不变...