node.js - socket.broadcast.emit 无法正确触发
问题描述
节点创建一个唯一的 url 并将 socket.io 绑定到它。
var io = require("socket.io").listen(server, {path: req.originalUrl});
当客户端连接时,还将他的 socket.io-client 绑定到该 url
var socket = io('192.168.1.101:3000', {path: window.location.pathname});
我没有问题,一切都很好。
当客户端执行特定操作时,服务器执行
socket.broadcast.emit("foo"); //I made console.log here and it prints
客户端:
socket.on("foo", () => console.log("okay"));
问题是客户端“foo”事件几乎从未被触发。有时它会被解雇,但仅限于特定场合。例如,socket.io-client 会自动重新连接到服务器,然后触发事件。
我不知道问题是否与此有关,因为例如 socket.emit 有效,但是当另一个客户端连接时,我总是收到此 错误
解决方案
socket.broadcast.emit("foo");
向所有连接的客户端广播一条消息,除了socket
. 如果要向所有连接的客户端广播,请使用:
io.broadcast.emit("foo");
您还必须确保您的客户端已正确连接,并且不会经常丢失和重新建立连接(您可以通过在服务器上记录连接和断开事件来查看是否正在发生这种情况)。如果他们以某种方式失去连接然后重新连接,那么哪些人会收到广播消息将取决于哪些人没有处于暂时失去连接的中间。
推荐阅读
- powershell - 在powershell中优化多个文件中的替换操作
- php - PHP 致命错误:我是 php 新手。在我的 wordpress 网站中出现这个未知错误
- python - Python pandas 数据框无法删除 int64 列
- selenium-webdriver - 如何使用以下代码编写点击按钮代码
- pyspark - 无法选择表中的列,因为列名之一是限制
- javascript - 保存在数据库中后,对象数组修改为对象数组数组
- r - 如何在点阵的条形图中设置 alpha?
- c# - MVC 中的 SSRS ReportViewer 未将参数传递给 DataSource
- sql-server - 如何在 Azure SQL 上禁用强密码
- liferay - portlet.getInstanceId() 在 portlet hook 的 JSP 中总是返回 null