-
12-11-2019 - |
题
是否可以以横域方式使用套接字?如果是这样,怎么样?在Web周围提到了这种可能性,但任何地方都没有给出代码示例。
解决方案
引用 socket.io常见问题解答:
ocket.io支持跨域连接?
绝对,在每个浏览器上! 关于它的方式:它是如何做的:本机WebSocket是跨域的设计,Socket.io为跨域闪存通信提供了一个闪存策略文件,XHR2可以使用CORS,最后您可以随时使用JSONP。
其他提示
** socket.io版本 - > 1.3.7 **
是否可以以横域方式使用socket.io? 是的,绝对。
如果是的话,如何?
选项1:强制使用websockets
默认情况下,websocket是跨域。如果要强制套接字。只使用它作为连接客户端和服务器的手段,你很好。
服务器侧
.
//HTTP Server
var server = require('http').createServer(app).listen(8888);
var io = require('socket.io').listen(server);
//Allow Cross Domain Requests
io.set('transports', [ 'websocket' ]);
客户端
.
var connectionOptions = {
"force new connection" : true,
"reconnectionAttempts": "Infinity", //avoid having user reconnect manually in order to prevent dead clients after a server restart
"timeout" : 10000, //before connect_error and connect_timeout are emitted.
"transports" : ["websocket"]
};
var socket = io("ur-node-server-domain", connectionOptions);
就是这样。问题?不适用于不支持WebSockets的浏览器(对于客户)。有了这个,你几乎杀死了套接字的魔法。因为它逐渐开始,长度轮询稍后升级到WebSockets(如果客户端支持它。)
如果您100%确定所有客户端都可以访问HTML5兼容浏览器,那么您很好。
选项2:允许服务器端上的CORS,让Socket.IO处理是否使用WebSocket或长轮询。
对于这种情况,您只需要调整服务器端设置。客户端连接与始终相同。
服务器侧
.
//HTTP Server
var express=require('express');
//Express instance
var app = express();
//ENABLE CORS
app.all('/', function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
next();
});
就是这样。希望它有助于其他人。
只在创建客户端套接字时插入远程域名:
var socket = io.connect('http://example.com:8080');
. socket.io支持跨域连接,但请记住,您的cookie不会传递给服务器。你要么是:
(1)提出替代识别方案(自定义令牌或javascript cookie--只要记住,除非您想让自己遭受会话劫持风险,否则这不应该是实际的会话ID)
或(2)首先向服务器发送良好的旧式HTTP JSONP请求以获取cookie。然后它将传输W /套接字连接握手。
简单安全!
在主文件中放置它之前('连接'),添加行:
io.set('origins', 'yoursite.com:*');
io.on('connection', function (socket) {
. 是的它。 我已经实现了Cross Domain Socket.io来测试它是否有效。
<script src="http://your-nodejs-domain.com:3000/public/js/jquery.js"></script>
<script src="http://your-nodejs-domain.com:3000/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://your-nodejs-domain:3000');
$(document).ready(function(){
socket.on('test message', function(msg){
console.log("Got the message: " + msg);
});
});
</script>
.
应该正常工作。
通过io创建您的服务器:
const server = require('http').createServer();
const io = require('socket.io')(server, {
origins:["127.0.0.1:8000"],
path: '/',
serveClient: false,
// below are engine.IO options
pingInterval: 20000,
pingTimeout: 5000,
cookie: false
});
io.on('connection', function(socket){
console.log("here new user welcom")
});
server.listen(3000,function(){
console.log('listening on *:3000')});
.
在ORIGIS数组中指定有效源