我检查了stream3.c
示例,发现当我在浏览器中关闭页面时,servlet(即stream3.c
)仍在运行大约2轮,然后终止。
这意味着,最后两轮的数据丢失了。
谁可以解释如何在发送数据之前确认连接状态?
显然,gwan知道连接状态,否则它不会终止stream3.c
,但gwan可能不实时知道。
如果无法实时了解,那么在不通过这种方式进行双重检查的情况下,就无法发送重要数据。
如何在发送数据之前确认连接状态?
唯一可靠的方法是尝试将数据发送到客户端套接字。如果连接已关闭,则呼叫将失败。
如果套接字已被回收(由另一个新连接重新使用),则SESSION_ID
(可能还有客户端IP地址)将不同。
如果连接被"干净地"关闭(如果客户端使用shutdown()
并在关闭前等待了一段时间),则G-WAN将在servlet之前知道连接的状态,否则,G-WAN将仅在发送回复时(或在读/写超时后)知道。
为了帮助解决这个问题所描述的那种情况,几周前为Websockets的工作人员添加了一个名为BEFORE_CLOSE
的新状态。