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

我有两个子域名:

  • socket.mydomain.com – Socket.IO服务器
  • app.mydomain.com – 一个Web应用程序,我想连接到我的networking套接字。

在app.mydomain.com的login页面中,我已经链接到了Socket.IO客户端脚本,并成功创build了一个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上的应用程序连接到app.mydomain.com上的套接字? 或者这是不可能的?

更新

与这个问题有关的所有现有的答案现在使用过时的代码,因为Socket.IO最近升级到1.0(事实上1.4)。 但是,即使考虑到这些代码更改, 似乎 Socket.IO不允许我正在尝试做什么。

当Socket.IO与服务器build立初始连接时,它会发送一个带有设置为true的withCredentials设置的XHR。 但是,您不能将withCredentials设置为true, 在服务器上允许CORS。 所以看来我的问题其实是,“这个问题有办法解决吗?

为了完成我想要的东西,需要正确configuration几个东西,而且我需要使用最新的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'] }); 
  • 远程服务器和可接受的传输必须在客户端( app.mydomain.com )上指定:

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