ドメイン間でSocket.IOを使用することは可能ですか?もしそうなら、どうですか?可能性はウェブ上で言及されていますが、コード例はどこにも与えられていません。
引用 socket.io FAQ :
Socket.IOはクロスドメイン接続をサポートしていますか?
もちろん、すべてのブラウザで!
ネイティブWebSocketは設計上クロスドメインであり、socket.ioはクロスドメインフラッシュ通信用のフラッシュポリシーファイルを提供し、XHR2はCORSを使用でき、最後に常にJSONPを使用できます。
** Socket.IOバージョン-> 1.3.7 **
Socket.Ioをクロスドメインの方法で使用することは可能ですか?はい、絶対に。
もしそうなら、どうですか?
オプション1:Webソケットのみの使用を強制する
デフォルトでは、WebSocketはクロスドメインです。 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);
それでおしまい。問題? WebSocketをサポートしていないブラウザ(クライアント用)では機能しません。これにより、Socket.ioの魔法がほとんどなくなります。これは、長いポーリングから徐々に始まり、後でWebSocketにアップグレードするためです(クライアントがサポートしている場合)。
すべてのクライアントがHTML5準拠のブラウザでアクセスすることを100%確信している場合は、問題ありません。
オプション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を取得します。次に、ソケット接続ハンドシェイクで送信されます。
簡単で安全!
メインファイルで、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')});
origins配列で有効なOriginを指定します