在不同的子域上使用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'] });