2012-01-23 26 views

答えて

27

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

絶対に、すべてのブラウザで!

に、それはそれをしない方法として:ネイティブWebSocketを設計によるクロスドメインあり、socket.ioはXHR2はCORSを使用することができ、最終的にあなたが常にJSONPを使用することができ、クロスドメインのフラッシュ通信のためのフラッシュポリシーファイルを提供しています。

+2

実際には、Cross Domain socket.io接続でいくつかの問題が発生しています。 socket.ioがXHR-Polling/Ajaxに戻ったとき、socket.ioは現在のドメイン/socket.io/1に要求を出そうとしますが、これは*** onClose ***を実行できません。*** null ** *。このエラーを調べると、いくつかのgithubの問題が発生しますが、私の状況には当てはまりません(**バグではなく、設定の問題だと思うので**)。 –

+1

この回答は、方法が古くなっています。ブラウザはAjax呼び出しの場合と同じようにWebSocketに対して同じ起点保護を実装します。クロスオリジンsocket.io接続を許可するには、socket.ioサーバーで明示的に有効にする必要があります。 – jfriend00

+0

リンクが無効です。 –

16

クライアント側のソケットを作成するときに単にあなたのリモートドメイン名を挿入します。

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

あまりにも古い答えです。 io.connectは関数ではありません。 –

+1

'io.connect'はまだ動作しているはずです(2016):http://socket.io/docs/#using-with-express-3/4。 socket.io/docs/client-api/も参照してください: "' connect'接続に成功すると起動します。 – vinyll

6

Socket.ioはクロスドメイン接続をサポートしていますが、あなたのクッキーがサーバに渡されないことに注意してください。

(1)カスタム識別方式(カスタムトークンまたはjavascriptのクッキー)を思いついてください。実際にセッションIDにする必要はありません。セッションハイジャックの危険にさらされます)

または(2)古い古いHTTP JSONP要求をサーバーに送信してからクッキーを取得します。それから、ソケット接続ハンドシェイクで送信されます。

2

簡単で安全です! io.on前にメインファイルの場所、それを( '接続')で

、行を追加します

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

io.on('connection', function (socket) { 
1

をはい、それはありません。 クロスドメイン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> 

正常に動作するはずです。

+0

私は同じ問題を抱えていますが、その問題はありません。 –

+0

あなたはserver.jsアプリケーションの完全なコードを教えてください – zero8

12

** Socket.IO版 - > 1.3.7 **

は、クロスドメインの方法でSocket.Ioを使用することが可能ですか? はい、絶対に。

もしそうなら、どうですか?

オプション1:デフォルトのWebSocketの強制使用のみ

、WebSocketをクロスドメインです。 Socket.ioにクライアントとサーバーを接続するための手段としてのみ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); 

。問題? Webソケットをサポートしていないブラウザ(クライアント用)では動作しません。これでSocket.ioという魔法はかなり消滅します。長いポーリングで徐々にWebSocket(クライアントがサポートしている場合)にアップグレードしてから徐々に始まります。

すべてのクライアントがHTML5に準拠したブラウザであれば、良い結果が得られます。

オプション2:サーバー側でCORSを許可し、Webソケットを使用するかロングポーリングを使用するかをSocket.ioに許可します。

この場合、サーバー側の設定を調整するだけで済みます。クライアント接続は常に同じです。それだ

サーバー側

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

。それが他の人に役立つことを願っています

+0

あなたは先生です、上司です! – tanwaniniranjan

+2

@tanwaniniranjanそれはあなたを助けることができるとうれしい^ _ ^(しかし、私は '女性のボス'、hehe)です。 – Chayemor

+1

hehe、大丈夫です! あなたは乙です、上司です:) – tanwaniniranjan