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

dwh*_*ieb 5 javascript sockets node.js socket.io

我有两个子域名:

  • 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>
Run Code Online (Sandbox Code Playgroud)

但是,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.所以看来我的问题实际上是,"这个问题有办法解决吗?"

dwh*_*ieb 7

要完成我想要的,需要正确配置几件事,我需要使用最新的Socket.IO语法:

  • 必须在socket.mydomain.com服务器上启用CORS (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']
    });
    
    Run Code Online (Sandbox Code Playgroud)
  • 必须在client(app.mydomain.com)上指定远程服务器和可接受的传输:

    const socket = io('socket.mydomain.com', {
      transports: ['websocket', 'xhr-polling']
    });
    
    Run Code Online (Sandbox Code Playgroud)