【问题标题】:Different Users having same username shows in socket.io & node.js具有相同用户名的不同用户显示在 socket.io 和 node.js 中
【发布时间】:2018-02-22 15:03:00
【问题描述】:

我正在 Node.js 和 Socket.io 中创建聊天应用程序。

它工作正常,但我遇到了一个小问题。

工作(这就是我想要的)

  1. 在一个选项卡上,用户输入他的昵称。
  2. 用他的昵称向连接用户发送消息/
  3. 在第二个选项卡上,用户输入他的昵称。
  4. 用他的名字向连接的用户发送消息。

问题

当第一个用户连接并向聊天发送消息时,它会显示他的正确昵称,当我打开另一个选项卡时,选择昵称,然后向聊天发送消息它会使用他正确的昵称向聊天发送正确的消息.

但是当我再次转到第一个选项卡并发送消息时,消息已发送,但现在显示第二个选项卡用户的昵称。

下面是我的代码,看看我做错了什么?

客户端 JS

$(function (){
		var socket = io();
		
		$('#nick-form').submit(function(e){
				e.preventDefault();
				socket.emit('new user', $('#user_name').val() ,function(usernames){
					if(usernames){
						$('#username-area').hide();
						$('#chat-area').show();
					}else{
						$('#error_message').html('This username already exists.');
					}
			   });
			
			$('#user_name').val('');
		});
		
		socket.on('usernames', function(nicknames){
			var html = '';
			for(i=0; i < nicknames.length;i++){
				html +=nicknames[i] + '<br/>'
			}
			$('#online_users').html(html);
		
		});
		
		
		$('#message-form').submit(function (e){
			e.preventDefault();
			socket.emit('chat message', $('#m').val());
			$('#m').val('');
			//return false;
		});
		
		socket.on('new message', function(data){
			console.log(data);
			$('#messages').append($('<li>').text(data.nick +' : '+ data.msg));
		});
		
	})

服务器 JS

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

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

io.on('connection', function(socket){
	
	socket.on('new user', function(get_username, callback){
		if(nicknames.indexOf(get_username) != -1 ){
			callback(false);
		}else{
			callback(true);
			console.log('Username: ', get_username);
			io.nickname = get_username;
			nicknames.push(io.nickname);
			updateNIcknames();
		}
	});
	
	function updateNIcknames(){
		io.emit('usernames', nicknames);
	}
	
	socket.on('chat message', function(data){
		console.log(io.nickname+' : '+data);
		io.emit('new message', {msg:data, nick: io.nickname}); // at here i am sending nickname and message
	});
	
	socket.on('disconnect', function(nickname){
		if(!io.nickname) return;
		console.log('User dissconected ');
		nicknames.splice(nicknames.indexOf(io.nickname),1);
		updateNIcknames();
	});
});
http.listen(3000, function(){
	console.log('listening on port *:3000');
});

【问题讨论】:

  • 能否也分享一下html代码

标签: node.js sockets websocket socket.io


【解决方案1】:

问题是服务器不知道消息是谁发送的,所以你需要给消息起昵称:

$(function (){
    var socket = io();
    var username = "";  // <----- here


    $('#nick-form').submit(function(e){
            e.preventDefault();
            username = $('#user_name').val();
            socket.emit('new user', username ,function(usernames){
                if(usernames){
                    $('#username-area').hide();
                    $('#chat-area').show();
                }else{
                    $('#error_message').html('This username already exists.');
                }
           });

        $('#user_name').val('');
    });

    socket.on('usernames', function(nicknames){
        var html = '';
        for(i=0; i < nicknames.length;i++){
            html +=nicknames[i] + '<br/>'
        }
        $('#online_users').html(html);

    });


    $('#message-form').submit(function (e){
        e.preventDefault();
        socket.emit('chat message', {nick: username , msg: $('#m').val()}); // <--- here
        $('#m').val('');
        //return false;
    });

    socket.on('new message', function(data){
        console.log(data);
        $('#messages').append($('<li>').text(data.nick +' : '+ data.msg));
    });

});

服务器:

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

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

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

socket.on('new user', function(get_username, callback){
    if(nicknames.indexOf(get_username) != -1 ){
        callback(false);
    }else{
        callback(true);
        console.log('Username: ', get_username);
        nicknames.push(get_username); // <----- here
        updateNIcknames();
    }
});

function updateNIcknames(){
    io.emit('usernames', nicknames);
}

socket.on('chat message', function(data){
    console.log(data.nick+' : '+data.msg);
    io.emit('new message', {msg:data.msg, nick: data.nick}); // <----- here
});

socket.on('disconnect', function(nickname){
    if(!io.nickname) return;
    console.log('User dissconected ');
    nicknames.splice(nicknames.indexOf(io.nickname),1);
    updateNIcknames();
});
});
http.listen(3000, function(){
   console.log('listening on port *:3000');
});

【讨论】:

  • 我正在关注这个讲座youtube.com/watch?v=dOSIqJWQkXM,但它工作正常,那为什么我的服务器不知道谁发送消息?
  • @Bougarfaougi 我按照你说的做,但现在它什么也没有显示,甚至没有一个用户名。 data.nick 为空?
猜你喜欢
  • 1970-01-01
  • 2016-07-15
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 2017-01-31
  • 2013-01-26
  • 1970-01-01
  • 2020-01-10
相关资源
最近更新 更多