在不同子域上使用Socket.IO服务器和客户端
Using Socket.IO server and client on different subdomains
我有两个子域:
- socket.mydomain.com-socket.IO服务器
- app.mydomain.com-我想连接到我的网络套接字的网络应用程序
在app.mydomain.com的登录页中,我链接了Socket.IO客户端脚本,并成功创建了一个IO对象,如下所示:
<script src=https://socket.mydomain.com/socket.io/socket.io.js></script>
<script type=text/javascript>
const socket = io();
socket.on('message', data => console.log(data));
</script>
但是,客户端并没有尝试连接到socket.mydomain.com
,而是尝试连接到了app.mydomain.com
。因为app.mydomain.com
上没有套接字,所以它会失败并不断重试。
有没有办法将我在app.mydomain.com
的应用程序连接到socket.mydomain.com
的插座?或者这是不可能的?
更新
与这个问题相关的大多数现有答案现在都使用了过时的代码,因为Socket.IO最近升级到了1.0(实际上是1.4)。然而,即使考虑到这些代码更改,看起来也像Socket.IO不允许我尝试做的事情。
当Socket.IO与服务器建立初始连接时,它会发送一个withCredentials
设置为true的XHR。但是不能在服务器上将withCredentials
设置为true并且允许CORS。所以我的问题似乎是,"有办法解决这个问题吗?"
要实现我想要的,需要正确配置几件事,并且我需要使用最新的Socket.IO语法:
-
CORS必须在
socket.mydomain.com
服务器上启用(Access-Control-Allow-Origin
标头设置为*
) -
必须在服务器上指定可接受的传输(
socket.mydomain.com
):const app = express(); const server = http.createServer(app); const io = require('socket.io')(server, { transports: ['websocket', 'xhr-polling'] });
-
必须在客户端(
app.mydomain.com
)上指定远程服务器和可接受的传输:const socket = io('socket.mydomain.com', { transports: ['websocket', 'xhr-polling'] });
相关文章:
- 如何使用Socket.io将命令从客户端发送到服务器
- Socket.io socket.emit 不将数据传递到服务器
- Socket.IO socket.id 更改同一客户端而不重新连接
- Node.js+Express+socket.io-socket.io服务不正常
- 节点.js /socket.io/socket.io.js 找不到
- 发出到套接字 IO socket.id
- 将socket.io/socket.io.js加载到html头中返回"ReferenceError:io未定义
- 错误连接拒绝http://localhost:3000/socket.io/socket.io.js.
- Sails.js IO.socket not firing
- 使用AJAX与套接字.IO socket消息
- Socket.io socket.disconnect();
- 正在检索io.socket中的所有套接字对象
- Socket IO - Socket.Emit被发送到所有客户端
- Express.js 'socket.io/socket.io.js 404'
- 使用公共IP运行/socket.io/socket.io.js
- socket.io/socket.io.js stuck on (pending) - Node.js
- 我得到了GEThttp://localhost:81/socket.io/socket.io.jsnet::ERR_CO
- Node.js /socket.io/socket.io.js not found express 4.0
- 带io.socket的sails应用程序
- Express -如何在路由文件中使用io.socket.emit