Javascript 节点+;socket.io聊天服务器。。我能错过一些留言吗?
我已经使用Node JS和socket.io完成了几个项目 在我的上一个项目中,即构建一个类似聊天室的功能,我做了以下事情Javascript 节点+;socket.io聊天服务器。。我能错过一些留言吗?,javascript,node.js,websocket,socket.io,Javascript,Node.js,Websocket,Socket.io,我已经使用Node JS和socket.io完成了几个项目 在我的上一个项目中,即构建一个类似聊天室的功能,我做了以下事情 我呈现了一个空白框,其中显示聊天信息 然后我连接到socket.io服务器 当连接请求转到服务器时,我还将该聊天室的所有旧聊天信息推送到浏览器 在聊天会话期间,如果任何用户同时断开连接(网络故障),则在重新连接时,所有旧聊天信息都将被提取并覆盖在以前的信息上 现在,我想问,我是否有可能错过显示一些聊天信息。到目前为止,我还没有看到这种情况发生 我想的是,如果一条消息在创建连
请原谅,如果这听起来像一个基本问题,我无法思考这个问题 我想我们可以猜到,你可以用最后10或20条帖子创建一个数组[messages],当你再次连接它发送时。如果连接重置正常是重新加载页面,如果您无法删除默认设置并包含最后20篇文章,或者您希望保存 我想我们可以猜到,你可以用最后10或20条帖子创建一个数组[messages],当你再次连接它发送时。如果连接重置正常是重新加载页面,如果您无法删除默认设置并包含最后20篇文章,或者您希望保存 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);
});
});
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));
});
Client.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);
});
});
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));
});
var socket=io.connect();
jQuery(函数($){
var sendMessage=$(“#发送消息”);
变量昵称=$(“#昵称”);
var set昵称形式=$(“#set昵称”);
var firstTime=true;
setNicknickForm.submit(函数(事件){
event.preventDefault();
socket.emit('昵称',昵称.val(),函数(数据){
如果(
setNicknickForm.hide();
sendMessage.show();
}否则{
setnickniform.prepend(“Ya esta cogido”);
}
//向上的信息
socket.on('old_messages',函数(数据){
如果(第一次){
对于(var i=1;iServer.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);
});
});
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));
});
Client.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);
});
});
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));
});
var socket=io.connect();
jQuery(函数($){
var sendMessage=$(“#发送消息”);
变量昵称=$(“#昵称”);
var set昵称形式=$(“#set昵称”);
var firstTime=true;
setNicknickForm.submit(函数(事件){
event.preventDefault();
socket.emit('昵称',昵称.val(),函数(数据){
如果(
setNicknickForm.hide();
sendMessage.show();
}否则{
setnickniform.prepend(“Ya esta cogido”);
}
//向上的信息
socket.on('old_messages',函数(数据){
如果(第一次){
对于(var i=1;i
我在想的是,如果一条消息在创建连接的时候被某人发送,会发生什么情况。是否有可能创建的新连接不会收到该消息
最终,我不这么认为。Node是一个单线程服务器。这两个事件将以一个简单的顺序执行。至少在功能级别,您的应用程序代码永远不会以交叉方式运行,因为它同时处理新连接和新消息
当然,您的各种回调可能会相互交错,因此您必须对此进行推理。但一旦进入函数内部,它将运行到完成,而您的任何数据都不会被代码的任何其他部分修改
我在想的是,如果一条消息在创建连接的时候被某人发送,会发生什么情况。是否有可能创建的新连接不会收到该消息
最终,我不这么认为。Node是一个单线程服务器。这两个事件将以一个简单的顺序执行。至少在功能级别,您的应用程序代码永远不会以交叉方式运行,因为它同时处理新连接和新消息
当然,您的各种回调可能会相互交错,因此您必须对此进行分析。但是,一旦进入函数内部,它将一直运行到完成,而您的任何数据都不会被代码的任何其他部分修改。一条消息完全在服务器端发送,但没有发送到客户端,这可能会导致错误如果消息在传输过程中连接丢失,则报警。这应该是一个频率非常低的事件,但也有可能
为了排除这个问题,为什么不引入像递增消息ID这样的东西呢
在重新连接时,客户端发送它以前收到的最后一条聊天消息的ID,服务器发送任何后续消息。如果消息在传输过程中丢失连接,则可能会发生完全在服务器端发送但尚未发送到客户端的消息。这应该是一种非常低的频率t、 但这是可能的
为了排除这个问题,为什么不引入像递增消息ID这样的东西呢
在重新连接时,客户端会发送上次收到的聊天信息的ID,服务器会发送任何后续信息。我不明白你的意思。你能详细说明吗?我不明白你的意思。你能详细说明吗?谢谢。这正是我所想的。我仍然很想看看其他人都说了些什么!:)谢谢..这正是我所想的..我仍然很想看看其他人都说了些什么!:)是的..我也可以这样做..现在,在连接/重新连接时,我正在发送所有的消息..这是可以避免的..在这种情况下是否有可能跳过消息