题
在我的申请了Mochiweb,我使用的是长保持HTTP请求。我想检测时,与用户的连接死了,我想通了,如何做到这一点做:
Socket = Req:get(socket),
inet:setopts(Socket, [{active, once}]),
receive
{tcp_closed, Socket} ->
% handle clean up
Data ->
% do something
end.
这工作时:用户关闭标签/浏览器或刷新页面。然而,当互联网连接突然死亡(比如WiFi信号丢失一下子),或在浏览器崩溃的异常,我不能够检测TCP关闭。
我失去了一些东西,或者是有任何其他方式来实现这一目标?
解决方案
有一个 TCP存活协议和它可以与inet:setopts/2
下被启用选项{keepalive, Boolean}
。
我会建议你不要使用它。保持连接超时和最大重试次数,往往是全系统,并且它毕竟是可选的。上协议层使用超时是更好。
在HTTP协议具有状态代码请求超时一>,你可以发送给客户端,如果它似乎已经死了。
查核在接收的块,可以使用超时等待数据,或使用所述定时器模块,或使用after
的erlang:start_timer/3
子句。它们都具有不同的性能特征和资源成本。
其他提示
有没有一个默认的“保活”(但可以启用如果支持)协议通过TCP:万一有一个连接故障时,没有数据被交换,这转化为“沉默失败”。你会需要考虑自行例如这种类型的故障实现某种形式连接的探测。
这将如何影响HTTP? HTTP是无状态协议 - 这意味着,每一个要求是独立每个其它的。的“保持活动” HTTP的功能不改变,即“沉默失败”仍然可以发生。
<强>仅当数据被交换强>在此条件被检测到时(或当TCP保持激活使能)。
我建议发送应用程序级别保持在编码分块HTTP有效消息。让你的客户机/服务器智能足够的了解,保持活动的消息,而忽略他们,如果他们在时间或关闭并再到重新建立连接。
不隶属于 StackOverflow