Socket.IOのクロスドメイン接続
-
12-11-2019 - |
質問
クロスドメイン方式でsocket.ioを使用することは可能ですか?もしそうなら、どうですか?可能性はWeb周りに記載されていますが、どこでもコード例はありません。
解決
socket.ioはクロスドメイン接続をサポートしていますか?
絶対に、すべてのブラウザで!
ネイティブWebSocketはデザインによってクロスドメインであるSocket.ioでは、クロスドメインフラッシュ通信のフラッシュポリシーファイルを処理し、XHR2はCORSを使用でき、ついにJSONPを使用できます。
他のヒント
** socket.ioバージョン - > 1.3.7 **
クロスドメイン方式でソケットを使用することは可能ですか? はい、絶対に。
であれば、どのように?
オプション1:WebSocketsのみの使用のみ
デフォルトでは、WebSocketsはクロスドメインです。 Socket.ioを強制的に使用して、クライアントとサーバーを接続するための手段だけを使用する場合は、行ってもいいです。
サーバ側
.
//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をサポートしていないブラウザ(クライアント用)には機能しません。これにより、Socket.ioであるマジックをほとんど殺して、後でWebSockets(クライアントがサポートしている場合)
あなたがすべてのクライアントがHTML5準拠のブラウザにアクセスすることができることを100%確信している場合は、行ってもいいです
オプション2:サーバー側でCORを許可する、socket.ioにWebSocketまたはLong Pollingを使用するかどうかを処理させます。
この場合は、サーバー側の設定を調整するだけです。クライアント接続は常に同じです。
サーバ側
.
//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にしないでください)を覚えておくべきではありません。P>
または(2)最初に古い昔ながらのHTTP JSONP要求を最初にサーバーに送ります。その後、ソケット接続ハンドシェイクW / The Socket Connection Handshakeに送信されます。
簡単でセキュリティ!
メインファイルの前にio.on( 'connection')の前に配置し、行を追加します。
io.set('origins', 'yoursite.com:*');
io.on('connection', function (socket) {
. はい、そうです。 私はそれが機能するかどうかをテストするためにクロスドメイン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')});
.
起源配列で有効な原点を指定