我的主要布局html中有以下代码
var baseUrl = "{{ env('SOCKET_BASE_URL') }}";
var socket = io.connect(baseUrl + ':3000');
socket.on("message-channel:App\\Events\\BroadcastMessageToUser", function(message){
// alert the user about the message
});
我的问题是,有时在发出消息时,及时,用户接收消息刷新或点击链接;此侦听器将错过该消息。(该消息将永远不会被接收,但已被发送)
现在我认为,如果可以将此侦听器分开,以便即使刷新选项卡或用户单击链接,也不会刷新此侦听器,它仍将连接到接收消息。谢谢。
答案 0 :(得分:1)
这是不正确的。 Socket.io只有传输信息,它不会持久它。为了确保在新的HTTP请求中保留信息,您需要将所有消息存储在数据库,文件系统或其他更永久的介质中。
答案 1 :(得分:1)
你不能将听众与选项卡分开"。刷新浏览器页面时,将关闭所有webSocket连接,并释放与该页面关联的所有状态。在页面刷新时,您无法保持该页面的webSocket / socket.io连接打开。
广播到所有连接的客户端的socket.io方法仅发送给此时连接的所有客户端。如果您希望将来短时间连接的客户端也能获得特定消息,那么您必须保存该消息并在下次连接时将其发送给这些客户端。
假设您有一些识别每个用户连接的方法,您可以跟踪用户何时断开其socket.io连接,然后如果您在此后不久看到连接事件,您可以向他们发送任何消息他们在重新连接时会错过。您必须维护某种最近消息列表,最近断开连接的客户端列表,并且可能使用某种事件计数器,以便您可以知道哪些事件要发送新重新连接的客户端。