web-dev-qa-db-ja.com

特定のパスと名前空間を使用してSocket.IOサーバーに接続する

Node.jsアプリケーションはURL http://www.example.com/myapp/ で実行されています。

Socket.IOサーバー(バージョン1.3.5)をカスタム名前空間で構成しました。コードスニペットの例を次に示します。

var server = http.createServer(...);
var io = socketio(server);
io
    .of('/a/b/c')
    .on('connection', function (socket) {
        socket.emit('update', {msg: '/a/b/c'});
    });

クライアントからこのサービスに接続する方法がわかりません。私の推測(これらはどれも機能していません):

io.connect('http://www.example.com/myapp/a/b/c');
io.connect('http://www.example.com', {path: '/myapp/a/b/c'});
io.connect('', {path: '/myapp/a/b/c'});
io.connect('http://www.example.com/a/b/c', {path: '/myapp'});
io.connect('http://www.example.com', {path: '/myapp/socket.io/a/b/c'});
27
guidoman

サーバーで、パスも指定することを忘れないでください:

var io  = require('socket.io')(http, { path: '/myapp/socket.io'});

io
.of('/my-namespace')
.on('connection', function(socket){
    console.log('a user connected with id %s', socket.id);

    socket.on('my-message', function (data) {
        io.of('my-namespace').emit('my-message', data);
        // or socket.emit(...)
        console.log('broadcasting my-message', data);
    });
});

クライアントでは、名前空間とパスを混同しないでください。

var socket = io('http://www.example.com/my-namespace', { path: '/myapp/socket.io'});
57

私も1.3.5を使用しています。少し似たシナリオで、Angularシングルページアプリから、socket.ioのクライアントコードがアプリの他の部分と連結されているだけです(から特定のネットワークの場所からダウンロード/インクルードするのではなく、お辞儀パッケージ)。

Socket.ioが設定されているセットアップで、私にとってはうまくいくと思われるもの:

http://somedomain.com:9096/sockets/socket.io.js

デフォルトではなく:

http://somedomain.com:9096/socket.io/socket.io.js

(サーバー側でパスを手動で調整しました):

io.connect('http://somedomain.com:9096' + '/' + namespaceName, { path: '/sockets' });

それはあなたのシナリオと同等に見えます:

io.connect('http://www.example.com/a/b/c', {path: '/myapp'});

もう一度試す価値があるかもしれません。 namespaceNameにスラッシュを完全にはテストしていませんが、名前空間を'/a/b/c'に変更するだけで、クライアント側で接続が取得されるようです。

おそらく違いを生むのは、サーバー側のセットアップです。

var server = http.createServer(app);
var io = require('socket.io')(server, { path: '/sockets' }).listen(server);

私の答えは、セットアップが自明ではないにもかかわらず、名前空間とカスタマイズされたパスの両方を使用することが可能であるという一般的な兆候です。何らかの形であなたの役に立つことを願っています。

7
Wojtek

Rooms and Namespaces の公式ドキュメントを確認できます。基本的に、socket.ioは、クライアントがクライアント側ソースを要求すると、クライアントがサーバーに接続するために必要なすべての必要な詳細(ホスト、パス、ポートなど)を送信することです。

特定のネームスペースに接続するには、クライアント上で次を指定するだけです。

var socket = io('/a/b/c');
1