套接字有两种主要风格。 活动套接字连接到a 通过开放数据远程活动套接字 连接...被动插座是 没有连接,而是等待 传入连接,将 一旦产生一个新的活动套接字 建立连接 ...
每个端口都可以有一个被动端 等待它的插座 传入的连接,和 多个活动套接字,每个 对应开放 端口连接。就好像 工厂工人正在等待新的 消息到达(他代表 被动套接字),当一个 消息来自新发件人,他 发起通信(a 与他们联系 委派他人(活跃的 socket)实际读取数据包 并回复发件人 必要的。这允许工厂 工人可以自由接收新的 数据包。 ...
然后教程解释说,在建立连接后,活动套接字继续接收数据,直到没有剩余字节,然后关闭连接。
我不明白的是:假设有一个到端口的传入连接,并且发送者想要每20分钟发送一些小数据。如果活动套接字在没有剩余字节时关闭连接,则每次发送数据时发送方是否必须重新连接到端口?我们如何坚持一次建立的连接更长时间?你能告诉我我在这里缺少什么吗?
我的第二个问题是,谁决定了同时工作的活动套接字的限制?
答案 0 :(得分:7)
发件人应定期发送KEEPALIVE数据包以保持连接活动。 KEEPALIVE的格式取决于协议。它可能与TCP数据段中的单个NULL一样小。
至于第二个问题......这取决于I / O.如果它阻止I / O,那么您只需要在计算机上运行一定数量的线程,因此您将无法拥有多个客户端。如果它是非阻塞的,你可以拥有更多的客户端。编程语言应该支持阻塞和非阻塞I / O. (我知道Java的事实。)
它还取决于带宽,每个客户端的数据传输,内存,时钟速度等等。但是非阻塞与阻塞可以使您可以接受的客户端数量产生巨大差异。在没有服务器崩溃的情况下,您可能无法阻止超过5-10个客户端...但如果您没有阻止,则可能有数千个客户端。
答案 1 :(得分:4)
请不要混淆TCP / IP实现通过网络发送的实际数据包以及程序与实现TCP / IP的库之间的交互。
套接字只是一个抽象,通过TCP / IP实现(库或内核操作系统)呈现给您的程序。您可以将套接字视为与管道的连接(localIP:port-remoteIP:port)。您的程序打开套接字,通过套接字传递数据,如果不再需要帮助释放资源,可以关闭套接字。这是正常的流程。但是,TCP / IP实现可能会因其有效原因而关闭套接字。其中一些原因:网络访问电缆断开,网络路由错误,服务器发生故障等等。因此,即使没有关闭它,您的程序也可能发现tcp / ip socket已关闭。
现在是您的第一个问题,如果我的程序发送的数据段较小且间隔时间较长,我该怎么办?答案是:取决于暂停的时间长短以及程序在另一侧监听的程度。大多数TCP / IP实现都有连接超时的概念,以便为您提供真实不可靠网络上可靠连接的抽象。因此,如果您的程序暂停时间超过tcp / ip超时,您会发现您的套接字已被库关闭,您需要重新打开套接字。这也可能导致您重新开始重新通信,这取决于在tcp / ip连接管道的另一端侦听您的程序。
有一些方法可以增加tcp / ip超时并使其保持活动状态。这些可以作为网络配置的一部分,另一端的服务器软件配置或通过在tcp / ip库调用中设置KEEPALIVE参数明确要求保持套接字打开来完成。是否仍然开放取决于。 tcp / ip如何保持套接字打开的完整细节不应该让您感到困惑,因为它与您的代码无关。 TCP / IP具有许多设置和不同的超时,为您的程序提供稳定可靠连接的假象。只要您不滥用它,它就会隐藏在您的程序代码中。保持暂停不到几秒钟:)一组超时设置可能适用于可靠本地网络中的小型应用程序,不适用于高负载应用程序或跨大陆连接。每种具体情况都有自己的解决方案,通常不止一种。
在这个具体的问题“每20分钟发送一些小数据”我建议你关闭并打开每个通信的套接字连接。打开一个的时间不到一秒钟,不应影响您的沟通。作为回报,您的通信协议的复杂性会降低。 Receiver总是在新的套接字连接上重新开始,并且当您不需要时,两个系统都可以在20分钟内通过tcp / ip通信享受免费资源。
答案 2 :(得分:0)
第一个问题: 是的,一旦套接字关闭,您必须打开以重新启动通信。
第二个问题: 你做。如果你想要你可以创建64k连接到您的服务器并遭受端口耗尽(我不建议这样做)。就像ktm5124所述,这一切都取决于你的应用程序。有几种不同的方法可以使服务器可扩展,包括使用异步I / O和/或线程池来处理客户端请求。