Socket.io连接事件没有触发

时间:2016-11-06 00:11:30

标签: node.js socket.io

这是我第一次使用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 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分: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>

答案 2 :(得分:0)

我可以在您的代码中看到两个问题。

一个是你不需要套接字&#34;连接&#34;功能。你可以把你的代码放在io&#34;连接&#34;上,当用户连接时它会激活。

io.on("connection", function (socket) {
  // Do connect stuff here
})

另一个是你的套接字断开功能,你发出断开连接,这可能会导致问题,因为它与其他功能共享名称。做这样的事情:

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