Socket.io连接事件未触发

4
这是我第一次使用node.js/socket.io,我在所有套接字上触发“connect”事件时遇到了一些问题。我跟随聊天应用程序示例,然后尝试添加一个功能,即在用户连接或断开连接时,不会在控制台中显示,而是会在屏幕上显示。
如果我在聊天应用程序中打开多个选项卡,则所有选项卡的“disconnect”事件都将触发,但是“connect”事件似乎只对当前选项卡触发。 服务器(index.js)
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

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

io.on('connection', function(socket){
    socket.on('connect', function(){
        io.emit('connect', "A user connected");
    });
    socket.on('disconnect', function(){
        io.emit('disconnect', "A user disconnected");
    });
    socket.on('chat message', function(msg){
        io.emit('chat message', msg);
    });
});

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

客户端(index.html)

<script src="/socket.io/socket.io.js"></script>
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<script>
    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('disconnect', function(msg){
       $('#users').text(msg);
    });
    socket.on('connect', function(msg){
       $('#users').text(msg);
    });
</script>
3个回答

10
确保您的socket.io客户端和服务器使用相同的socket.io主版本。例如,使用socket.io@2.3.0作为服务器和客户端或socket.io-client@3..作为服务器和客户端。

救命稻草!我花了好几个小时试图弄清楚为什么服务器上会建立这么多连接,而客户端的“connect”事件里却没有任何事情发生! - James Barrett
@JamesBarrett 很高兴答案解决了你的问题。 - Princewill Iroka
你是英雄,行吗?谢谢。 - Aqilhex

2
我看到你的代码有两个问题。
其一是你不需要一个socket的“on connect”函数。你可以将你的代码放在io的“on connection”中,当用户连接时它会自动触发。
其二是你需要更好地处理错误,以便能够定位和解决问题。
io.on("connection", function (socket) {
  // Do connect stuff here
})

另一个问题是,在您的套接字断开函数中,您发出了“disconnect”,这可能会导致问题,因为它与其他函数共享名称。请改为执行以下操作:
//Server:
io.on('connection', function(socket){

    io.emit('set users', "A user connected");  

    socket.on('disconnect', function(){
        io.emit('set users', "A user disconnected");
    });

    socket.on('chat message', function(msg){
        io.emit('chat message', msg);
    });
});

//Client:
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));
  });

//You only need one function to set "#users"
socket.on('set users', function(msg){
    $('#users').text(msg); //this will set the text in #users
  });

0
你可以尝试这个,可能会起作用:
服务器:
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

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

io.on('connection', function(socket){

    io.emit('new user', "A user connected");  

    socket.on('disconnect', function(){
        io.emit('disconnect', "A user disconnected");
    });

    socket.on('chat message', function(msg){
        io.emit('chat message', msg);
    });
});

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

客户端:

<script src="/socket.io/socket.io.js"></script>
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<script>
    var socket = io();
    $('form').submit(function(){
        socket.emit('chat message', $('#m').val());
        $('#m').val('');
        return false;
    });
    socket.on('connect', function() {
      $('#users').text('I am connected!');
    });
    socket.on('chat message', function(msg){
       $('#messages').append($('<li>').text(msg));
    });
    socket.on('disconnect', function(msg){
       $('#users').text(msg);
    });
    socket.on('new user', function(msg){
       $('#users').text(msg);
    });
</script>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接