私はsocket.ioを初めて使い、かなり奇妙に思える何かに遭遇しました。 socket.emit
とio.emit
の違いは実際にはわかりませんが、どこにも説明がありません。
io.on('connection', function(socket){
io.emit('connected') // <<<< HERE >> socket.emit('connected');
socket.on('disconnect', function(){
io.emit('disconnect')
});
socket.on('chat message', function(msg){
io.emit('chat message', msg);
});
});
server.listen(3000);
それは私のサーバーのものですが、io
をsocket
に変更すると、接続しているユーザーが接続したときにのみメッセージが表示されます。 io.emit
は、すべてのユーザーにメッセージを送信します。
たぶんそれはそのようになっているのでしょうか、それとも恐ろしいハックでしょうか?クライアント側のHTMLが必要な場合はお知らせください。
参照用の補足ドキュメントを次に示します。
socket.emit('message', "this is a test"); //sending to sender-client only
socket.broadcast.emit('message', "this is a test"); //sending to all clients except sender
socket.broadcast.to('game').emit('message', 'Nice game'); //sending to all clients in 'game' room(channel) except sender
socket.to('game').emit('message', 'enjoy the game'); //sending to sender client, only if they are in 'game' room(channel)
socket.broadcast.to(socketid).emit('message', 'for your eyes only'); //sending to individual socketid
io.emit('message', "this is a test"); //sending to all clients, include sender
io.in('game').emit('message', 'cool game'); //sending to all clients in 'game' room(channel), include sender
io.of('myNamespace').emit('message', 'gg'); //sending to all clients in namespace 'myNamespace', include sender
socket.emit(); //send to all connected clients
socket.broadcast.emit(); //send to all connected clients except the one that sent the message
socket.on(); //event listener, can be called on client to execute on server
io.sockets.socket(); //for emiting to specific clients
io.sockets.emit(); //send to all connected clients (same as socket.emit)
io.sockets.on() ; //initial connection from a client.
お役に立てれば!。
io
変数は、ソケットのグループを表します。新しい接続が作成されるたびにsocket
変数を提供する関数を2番目のパラメーターに提供することで、1行目からコードを開始します。 socket
変数は、個々の接続との通信専用です。コードには表示されない場合がありますが、確立された接続ごとにsocket
変数が1つあります
それは良い質問です。質問に答えるサンプルコードを次に示します。
server.jsコード:
//着信ソケット接続のリスナー
io.on('connection', function(socket){
socket.on('send', function(msg){
console.log('message received/sending: ' + msg);
io.sockets.emit('new', msg);
});
});
index.htmlコード
<body>
<ul id="messages"></ul>
<form action="">
<input id="m" autocomplete="off" />
<button type="submit">Send</button>
</form>
<script src="https://code.jquery.com/jquery-1.11.1.js"></script>
<script src="https://cdn.socket.io/socket.io-1.4.5.js"></script>
<script>
var socket = io();
function send(msg) {
console.log("emitting: " + msg);
socket.emit('send', { "message": msg });
}
socket.on('new', function (msg) {
console.log("msg " + msg.message);
$('#messages').append($('<li>').text(msg.message));
});
$(function () {
$('form').submit(function (e) {
e.preventDefault();
send($('#m').val());
$('#m').val('');
return false;
});
});
</script>
</body>
Index.htmlで「socket.emit( 'send'、{"メッセージ":msg});」このコード行は、実際に「socket.on( 'send'、function(msg){」でリッスンするのを待っているサーバーにメッセージを送信/発信します。server.jsのこのコード行。 new '、msg); "server.jsからのこの行は、すべてのソケットにそのメッセージを送信し、index.htmlのリスナーを使用してユーザーに表示されます。これは、socket.on(' new '、function(msg){"です。
簡単に言うと、各ソケットはそのメッセージをサーバー(ioはサーバーのインスタンス)に送信し、サーバーは順番にすべての接続されたソケットに送信します。これは、任意のユーザーが送信したmsgがすべてのユーザーに表示される方法です。私はそれが役立つことを願っています!