2012-07-16 9 views
88

これらの2つの違いは何ですか?socket.emit()とsocket.send()

作業中のプログラムでsocket.emitからsocket.sendに変更した場合、その理由はわかりませんが、サーバーはメッセージを受信できませんでした。

私のプログラムでは、socket.emitからsocket.sendに変更した場合、サーバーはメッセージを受信しましたが、それは複数回受信されたようです。サーバーが受け取った内容を確認するのにconsole.log()を使用すると、socket.emitを使用したときとは異なる何かが表示されます。

この現象はなぜですか? socket.emitまたはsocket.sendをいつ使用するかをどのように知っていますか?あなたがそのようなカスタムイベントを登録することができsocket.emitで

答えて

92

サーバー:

var io = require('socket.io').listen(80); 

io.sockets.on('connection', function (socket) { 
    socket.emit('news', { hello: 'world' }); 
    socket.on('my other event', function (data) { 
    console.log(data); 
    }); 
}); 

クライアント:

var socket = io.connect('http://localhost'); 
socket.on('news', function (data) { 
    console.log(data); 
    socket.emit('my other event', { my: 'data' }); 
}); 

Socket.sendは同じことが、あなたはしないでください「ニュース」に登録してメッセージに:

サーバー:

var io = require('socket.io').listen(80); 

io.sockets.on('connection', function (socket) { 
    socket.send('hi'); 
}); 

クライアント:

var socket = io.connect('http://localhost'); 
socket.on('message', function (message) { 
    console.log(message); 
}); 
+2

非常に大きな違いはありません。 socket.emit()はsocket.on()ができること全てを行うことができます。なぜ彼らはその機能を果たさなければならなかったのですか? –

+2

私はソースコードをチェックして、ほぼ同じものを作っています(https://github.com/LearnBoost/socket.io/blob/master/lib/socket.js#L318)。たぶん歴史的なもので、下位互換性のためかもしれません。 – Charles

+1

socket.ioのemit()は、EventEmitterのemit()がしゃべっていること以外の何かをしていますか?これは生の擬似ソケットの上にあるプロトコルで、生のメッセージではなく遠方の名前付きイベントとして出てきます。ある意味では、複数のストリームに対して1つのソケットを使用して多重化することができます。 – aredridel

20

socket.sendはバニラのWebSocketインタフェースとの互換性のために実装されています。 socket.emitは、Socket.IOの機能です。両方とも同じですが、socket.emitはメッセージを扱うのにもっと便利です。

+0

socket.emitはSocket.IOに限らず、ネット上でも動作します。 – ajay

38

TL 'message'イベントで受信したメッセージを送信し、サーバーとクライアント

socket.sendにカスタムイベントを放出することができます。DR :

socket.send(data, callback)は、本質的にはsocket.emit('message', JSON.stringify(data), callback)

ソースコードを見ることなく、send関数がより効率的であると仮定します。編集:文字列メッセージを送信するには、少なくとも

だから、基本的にemitはオブジェクトを送ることができます。これはとても便利です。

socket.emitで、この例を見てみましょう:

sendMessage: function(type, message) { 
    socket.emit('message', { 
     type: type, 
     message: message 
    }); 
} 

をし、自宅でスコアを維持するそれらのために、ここではsocket.sendを使用して次のようになります。

基本的な双方向通信システムでは
sendMessage: function(type, message) { 
    socket.send(JSON.stringify({ 
     type: type, 
     message: message 
    })); 
} 
0

、ソケット。emitはもっと説得力があり使いやすく(個人的な経験)、Socket.IOの一部であることが証明されています。

関連する問題