web-dev-qa-db-ja.com

Socket.IOでのクロスドメイン接続

ドメイン間でSocket.IOを使用することは可能ですか?もしそうなら、どうですか?可能性はウェブ上で言及されていますが、コード例はどこにも与えられていません。

28
CamelCamelCamel

引用 socket.io FAQ

Socket.IOはクロスドメイン接続をサポートしていますか?

もちろん、すべてのブラウザで!

ネイティブWebSocketは設計上クロスドメインであり、socket.ioはクロスドメインフラッシュ通信用のフラッシュポリシーファイルを提供し、XHR2はCORSを使用でき、最後に常にJSONPを使用できます。

28
igorw

** 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();
 });

それでおしまい。それが他の誰かを助けることを願っています。

20
Chayemor

クライアント側のソケットを作成するときに、リモートドメイン名を挿入するだけです。

var socket = io.connect('http://example.com:8080');
17
vinyll

Socket.ioはクロスドメイン接続をサポートしていますが、Cookieがサーバーに渡されないことに注意してください。次のいずれかを行う必要があります。

(1)代替の識別スキームを考え出す(カスタムトークンまたはJavaScript Cookie-セッションハイジャックのリスクを冒したくない場合を除いて、これは実際のセッションIDではないことに注意してください)

(2)古き良きHTTP JSONPリクエストを最初にサーバーに送信してCookieを取得します。次に、ソケット接続ハンドシェイクで送信されます。

8
mikermcneil

簡単で安全!

メインファイルで、io.on( 'connection')の前に次の行を追加します。

io.set('origins', 'yoursite.com:*');

io.on('connection', function (socket) {
3
user5046034

はい、そうです。クロスドメイン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>

それはうまくいくはずです。

1
Kurt Campher

次のように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を指定します

0