Error socket.io Node.js

Asked

Viewed 539 times

1

The intention with the program is that when two clients connect to display in a client window the id of the other. The program saves the two ids in the variables but sends only to the first user who connected. The second connected 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>
  • You can include your full code?

  • I edited the post with the full code, made an adaptation in the code I found on the socket.io website itself. I’m trying to get two clients to interact with each other.

1 answer

1

Edit your connection by adding 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 the socket.broadcast.emit. The socket.emit will send the notification only to the current customer, ie the client who has just entered the chat room. The socket.broadcast.emit will issue to all connected clients, with the exception of 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');

Really recommend this site for a real example of the use of socket.io

Browser other questions tagged

You are not signed in. Login or sign up in order to post.