问题描述
我有一个聊天网站(http://www.pitput.com),可通过套接字连接来连接用户。
我在客户端有一个Flash对象,用于打开到服务器端口的连接。
在服务器中,我有一个正在异步监听该端口的服务。
一切正常,除非当我在未知的时间段(大约几分钟)后与某人交谈时,服务器关闭了我的连接,并且服务器出现错误:
\“连接尝试失败,因为连接的一方在一段时间后未正确响应,或者建立的连接失败,因为连接的主机未能响应\”。
我不知道tcp套接字的工作原理。每隔几秒钟检查一次“实时”连接吗?如何确定何时关闭连接?我非常确定关闭操作不是来自客户端。
谢谢。
解决方法
听起来服务器正在处理连接但没有响应。这就是我通常拉出WireShark找出正在发生的事情的关键所在。
,TCP / IP确实具有用于检查实时连接的选项。它被称为“ keepalive”。Keepalive几乎从未使用过。默认情况下未启用它们。可以通过调整注册表在系统范围内启用它们,但是IIRC的最小超时为1小时。也可以在单个套接字上启用它们(超时时间以分钟为单位),但是您会知道您的应用程序是否这样做。
如果您使用的是Web服务,并且客户端正在连接到HTTP / HTTPS端口,则HTTP服务器可能会关闭该端口(通常在闲置几分钟后关闭其连接)。在一段时间的空闲时间之后,中间路由器也有可能代表您关闭它(这不是默认行为,但是公司路由器有时配置有此类“帮助”设置)。
如果您使用的是Win32服务,那么实际上听起来确实像客户端正在断开连接或失去其网络(例如,移动到无线路由器的范围之外)。在后一种情况下,客户端可能会忽略连接已关闭的事实(这种情况称为“半开放”);服务器看到关闭,但客户端认为连接仍然存在。
,这是某个公司托管的ASP Web服务吗?如果是这样,服务器通常每10至20分钟回收一次应用程序。您不能让Web服务无限期运行,除非它是您自己的服务器(我相信)。