socket.emit()とsocket.send()の比較


133

これら2つの違いは何ですか?

動作プログラムでからに変更するsocket.emitsocket.send、サーバーはメッセージを受信できませんでした。理由はわかりません。

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

なぜこの動作ですか?いつ使用するsocket.emitかをどのように知っていますかsocket.send

回答:


123

socket.emitを使用すると、そのようなカスタムイベントを登録できます。

サーバ:

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

3
それほど大きな違いはないようです。これは、socket.emit()がsocket.on()が実行できるすべてのことを実行できるように見えます。なぜ彼らはその機能を作らなければならなかったのですか?
ノード忍者

2
わかりません。ソースコードを確認したところ、ほとんど同じになりました(github.com/LearnBoost/socket.io/blob/master/lib/socket.js#L318)。多分それは歴史的で、後方互換性のためだけです。
Charles

37
また、この投稿の今後の読者は、これがsocket.ioに関するものであり、node.js TCP、UDP、またはUnixソケットに関するものではないことにも注意してください。
aredridel '25

3
バニラjavascript Websocketsを使用して発行することは可能ですか?
Alex Buznik 2014

11
socket.sendは単なるエイリアスのように見えますsocket.emit('message', message);
Mohit Gangrade

92

シンプルで正確(出典:Socket.IO google group):

socket.emit サーバーとクライアントでカスタムイベントを発行できます

socket.send'message'イベントで受信したメッセージを送信します


45

TL; DR:

socket.send(data, callback) 本質的に呼び出しと同等です socket.emit('message', JSON.stringify(data), callback)

ソースコードを見ないで、send関数はより効率的な編集だと思います:文字列メッセージを送信するために、少なくとも

つまり、基本的に出力はオブジェクトを送信できるため、非常に便利です。

この例を見てみましょう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
    }));
}

27

socket.sendバニラWebSocketインターフェイスとの互換性のために実装されています。socket.emitSocket.IOのみの機能です。どちらも同じように動作しますsocket.emitが、メッセージの処理には少し便利です。


socket.emitはSocket.IOに限定されず、ネットでも機能します。
Ajay、2014

0

基本的な双方向通信システムでは、socket.emitはより説得力があり、使いやすい(個人的な経験)ことが証明されており、そのような目的のために主に構築されたSocket.IOの一部です。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.