在不同子域上使用Socket.IO服务器和客户端

Using Socket.IO server and client on different subdomains

本文关键字:IO Socket 服务器 客户端      更新时间:2024-05-22

我有两个子域:

  • 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']
    });