web-dev-qa-db-ja.com

socket.emit()vs. socket.send()

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

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

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

なぜこの動作ですか? socket.emitまたはsocket.sendを使用するタイミングはどのようにわかりますか?

120
node ninja

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

シンプルで正確(ソース: Socket.IO googleグループ ):

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

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

76
M.D.

TL; 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
    }));
}
44
Kyle Shay

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

25
artch

https://socket.io/docs/client-api/#socket-send-args-ack

socket.send //メッセージイベントを送信します

socket.emit(eventName[, ...args][, ack]) // eventNameをカスタマイズできます

1
zhuxy

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

0
kg11