我使用Node JS& amp;做了几个项目。 socket.io ..
在我上一个建立聊天室功能的项目中,我做了以下事情。
我渲染了一个空白框,其中显示了聊天消息。
然后我连接到socket.io服务器。
当连接请求进入服务器时,我还将该聊天室的所有旧聊天消息推送到浏览器。
在聊天会话的中间,如果任何用户同时断开连接(网络故障),则在重新连接时将获取所有旧聊天消息&覆盖了之前的消息。
现在,我想,是否有可能错过显示一些聊天消息。到目前为止,我还没有看到这种情况。
我在想的是,如果某人只是在创建连接时传递了一条消息,会发生什么。创建的新连接是否有可能无法收到消息?
请原谅我,如果这听起来像一个基本问题,我无法通过这个问题来思考!
答案 0 :(得分:3)
如果在消息传输过程中连接丢失,则可能会发生完全在服务器端发送但未传送到客户端的消息。这应该是一个非常低频的事件,但它是可能的。
要排除问题,为什么不引入增量消息ID等内容?
在重新连接时,客户端会发送先前收到的上一条聊天消息的ID,然后服务器会发送任何后续消息。
答案 1 :(得分:1)
我在想的是,如果某人只是在创建连接时传递了一条消息,会发生什么。创建的新连接是否有可能无法收到消息?
最终,我不这么认为。 Node是单线程服务器。这两个事件将以一个简单的顺序执行。至少在功能级别,您的应用程序代码永远不会以交错的方式运行,它同时处理新连接和新消息。
你的各种回调当然可以相互交错,所以你必须对此进行推理。但是一旦你进入一个函数,它将运行完成,而你的代码的任何其他部分都不会修改任何数据。
答案 2 :(得分:0)
我认为我们可以猜到你可以创建一个包含最后10或20个帖子的数组[消息],当你再次连接它时发送。如果连接重置正常是重新加载页面,如果你不能删除默认值并包含最后20个帖子,或者你想要保存!
答案 3 :(得分:0)
<强> Server.js 强>
var nicknames = []
var old_messages = []
io.sockets.on('connection',function(socket){
socket.on('nickname',function(data, callback){
if (nicknames.indexOf(data) != -1){
callback(false);
}else{
callback(true);
nicknames.push(data);
socket.nickname = data;
io.sockets.emit('nicknames', nicknames);
//------------ send the old messages-------------
io.sockets.emit('old_messages', old_messages);
}
});
socket.on('user message',function (data){
// ------------ Update de old_message list --------------
old_messages.push(socket.nickname + " - " +data);
if (old_messages.length > 10)
{var aux = old_messages.pop()}
io.sockets.emit('user message', {
nick: socket.nickname,
message: data
});
});
socket.on('disconnect', function(){
if (!socket.nickname) return;
if (nicknames.indexOf(socket.nickname) > -1){
nicknames.splice(nicknames.indexOf(socket.nickname),1);
}
io.sockets.emit('nicknames', nicknames);
});
});
<强> Client.js 强>
var socket = io.connect();
jQuery(function ($) {
var sendMessage= $('#send-message');
var nickName = $('#nickname');
var setNicknameForm = $('#set-nickname');
var firstTime = true;
setNicknameForm.submit(function(event){
event.preventDefault();
socket.emit('nickname',nickName.val(),function(data){
if (
setNicknameForm.hide();
sendMessage.show();
} else {
setNicknameForm.prepend('<p> Ya esta cogido </p>');
}
// Uptade messages
socket.on ('old_messages', function(data){
if (firstTime){
for (var i=1; i<data.length(); i++){
$('#messages').append($('<p>').text(data[i]));
};
firsTime = false;
};
});
socket.on('nicknames',function(data){
$('#nicknames').empty().append($('<ul>'));
for(var i=0; i<data.length; i++) {
$('#nicknames ul').append('<li>' + data[i]);
}
});
});
});
sendMessage.submit(function(event){
event.preventDefault();
socket.emit('user message',$('#message').val());
$('#message').val('');
});
socket.on('user message',function(data){
$('#messages').append($('<p>').text(data.nick+" - "+data.message));
});