Error socket.io Node.js

1

The intention with the program is that when two clients connect they display in the window of one client the id of the other. The program saves the two ids in the variables but sends only to the first user who logged in. The second logged-on user does not receive anything.

server file:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

var userOne = 0;
var userTwo = 0;

app.get('/', function(req, res){
    res.sendFile(__dirname + '/public/index.html');
});

io.on('connection', function(socket){
    console.log('a user connected');
    if (userOne == 0){
        userOne = socket.id;
        console.log('id1:' + userOne);
    }else{
        userTwo = socket.id;
        console.log('id2:' + userTwo);
        socket.to(userOne).emit('saveId', userTwo);
        socket.to(userTwo).emit('saveId', userOne);
    }

    socket.on('chat message', function(msg){
        io.emit('chat message', msg);
    });
    socket.on('disconnect', function(){
        console.log('user disconnected');
    });
    socket.send(socket.id);
});


http.listen(3000, function(){
    console.log('listening on *:3000');
});

Client file:

<!doctype html>
<html>
<head>
    <title>Socket.IO chat</title>
    <style>
        * { margin: 0; padding: 0; box-sizing: border-box; }
        body { font: 13px Helvetica, Arial; }
        form { background: #000; padding: 3px; position: fixed; bottom: 0; width: 100%; }
        form input { border: 0; padding: 10px; width: 90%; margin-right: .5%; }
        form button { width: 9%; background: rgb(130, 224, 255); border: none; padding: 10px; }
        #messages { list-style-type: none; margin: 0; padding: 0; }
        #messages li { padding: 5px 10px; }
        #messages li:nth-child(odd) { background: #eee; }
    </style>
</head>
<body>
    <ul id="messages"></ul>
    <form action="">
        <input id="m" autocomplete="off" /><button>Send</button>
    </form>

    <script src="/socket.io/socket.io.js"></script>
    <script src="https://code.jquery.com/jquery-1.11.1.js"></script>
    <script>
        var idConect = 0;
        $('#messages').append($('<li>').text('Conectado ao id:' + idConect));
        $(function () {
            var socket = io();
            $('form').submit(function(){
                socket.emit('chat message', $('#m').val());
                $('#m').val('');
                return false;
            });
            socket.on('chat message', function(msg){
                $('#messages').append($('<li>').text(msg));
            });

            socket.on('saveId', function(id){
                idConect = id;
                $('#messages').append($('<li>').text('Conectado ao id:' + idConect));
            });
        });
    </script>
</body>
</html>
    
asked by anonymous 23.06.2017 / 05:35

1 answer

0

Edit your connection by adding the broadcast:

io.on("connection", function (socket) {
  socket.on("join", function(name){
    console.log("Entrou: " + name);
    clients[socket.id] = name; //id do user
    socket.emit('chat message', "Você se conectou no servidor.");
    socket.broadcast.emit('chat message', name + " acabou de entrar no chat.")
  });

There is a difference between the method socket.emit and socket.broadcast.emit . socket.emit will send the notification only to the current client, that is, the client who has just entered the chat room. socket.broadcast.emit will issue to all connected clients , except who is sending.

Examples of available methods:

// enviar apenas para o cliente atual
socket.emit('message', "this is a test");

// enviar para todos os clientes, inclusive o atual
io.emit('message', "this is a test");

// enviar para todos os clientes, exceto o atual
socket.broadcast.emit('message', "this is a test");

// enviar para todos os clientes (com exceção do atual) para uma sala específica
socket.broadcast.to('game').emit('message', 'nice game');

// enviar para todos os clientes em uma sala específica
io.in('game').emit('message', 'cool game');

// enviar para o atual, caso ele esteja na sala
socket.to('game').emit('message', 'enjoy the game');

// enviar para todos os clientes em um namespace 'namespace1'
io.of('namespace1').emit('message', 'gg');

// enviando para um socketid individual
socket.broadcast.to(socketid).emit('message', 'for your eyes only');

I really recommend this site for a real-life example of using socket.io

    
29.06.2017 / 19:43