web-dev-qa-db-ja.com

ソケット接続で追加データを送信する

ソケット接続時に追加データを最適に送信するにはどうすればよいですか?

クライアント:

socket.on('connect',function(){ 
//I'd like set some values and pass them up to the node server.
});

Node.jsサーバー:

io.on('connection', function(client){
//I'd like to get the data here.
});

たとえば、ユーザー名やメールアドレスなどを送信します。

66
Dan

接続または作成時にデータを送信する必要があります。

var s = io('http://216.157.91.131:8080/', { query: "foo=bar" });
s.connect();

var c = io.connect('http://216.157.91.131:8080/', { query: "foo=bar" });

socket.ioの新しいバージョン を使用すると、サーバー上で物事が変更されます。

var io = require('socket.io')(server);

io.use(function(socket, next) {
  var handshakeData = socket.request;
  console.log("middleware:", handshakeData._query['foo']);
  next();
});
52
Miquel

私は別のアプローチを持っています-接続した直後にデータでイベントを発行します:

socket.on('connect',function(){ 
    // Send ehlo event right after connect:
    socket.emit('ehlo', data);
});

io.on('connection', function(client){
    // Receive ehlo event with data:
    client.on('ehlo', function(data) {
    });
});

変数/オブジェクトを保持できます。たとえば、データを持つehloイベントがない場合、ehloが送信されるまで他のイベントは無視されます。

これが満たされない場合、接続時にデータをすぐに送信できます。コードをコピーすることはありませんが、この答えは次のとおりです。 https://stackoverflow.com/a/13940399/1948292

23
Daniel W.

connectionイベントは、TCP接続が確立されるとすぐに発生します。間に何かを送信する方法はありません。

できることは、サーバーから送信された最初のメッセージを取得し、そのメッセージにデータを入れるだけです。このためにいくつかのシンプロトコルをロールすることを強くお勧めします。そのため、複数のタイプのメッセージがあり、それらを使用してコードがデータを処理する方法を決定します。

汎用アーキテクチャを思い付くのはかなり簡単なので、これも拡張性が高いでしょう。 userdataが最初に来るのを待ちたい場合は、接続に状態を追加するだけです。

12
Ivo Wetzel

クエリデータをnodejsおよびserver.ioサーバークライアントに送信するためのこのコード

var socket = io.connect(window.location.Origin,{query:'loggeduser=user1'});

io.sockets.on('connection', function (socket) {
    var endp = socket.manager.handshaken[socket.id].address;
    console.log("query... " +  socket.manager.handshaken[socket.id].query.user);
});

クエリ... user1

6
mukut

この点で、ここにある答えが本当に役立つことがわかりました: socket.ioにhandshakeDataと共にカスタムデータを送信します

また、次のドキュメントをブラッシュアップすると、接続中にソケットオブジェクトからアクセスできるハンドシェイクオブジェクトに変数を関連付ける方法を説明できます。 https://github.com/LearnBoost/socket.io/wiki/Authorizing #global-authorization

5
Art Geigel

これはソケットバージョン2.1.1の私のコードです

//client side
var socket = io.connect(window.location.Origin,{query:'loggeduser=user1'});

// server side
io.socket.on('connection', function (socket) {
    console.log("loggeduser => " +  socket.handshake.query.loggeduser);
});
2
Manoj Rana