【发布时间】:2016-01-25 04:14:02
【问题描述】:
我可以知道客户端断开连接并重新连接后导致聊天消息的哪一部分代码不再显示在客户端浏览器上,但是聊天仍会发送到服务器,其他用户将能够看到该消息,只是原始发件人本身将无法接收该消息。我想知道这是套接字问题还是javascript问题?
在此先感谢,并为我的英语不好感到抱歉:)
Socket IO 版本 1.3.7
注意:我正在将聊天与 laravel 集成,因此不会在这里使用任何 nodejs 路由,我想这不会对我造成任何问题,因为聊天能够正常运行......只是上面的问题我目前面临现在
//server.js
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
io.on('connection', function(socket){
//console.log('a user connected: ' + socket.id);
socket.on('disconnect', function(){
console.log( socket.name + ' has disconnected from the chat.' + socket.id);
io.emit('user', io.sockets.sockets.length);
io.emit('chat message', socket.name + ' has disconnected from the chat.');
});
socket.on('join', function (name) {
socket.name = name;
console.log(socket.name + ' joined the chat.'+ socket.id);
io.emit('user', io.sockets.sockets.length);
io.emit('chat message', socket.name + ' joined the chat.');
});
socket.on('chat message', function(msg){
io.emit('chat message', msg);
console.log(msg);
});
});
http.listen(3000, function(){
console.log('listening on *:3000');
});
''
//Client code here
<div class="board" style="position: absolute;right:40%;width:350px;height:500px;" id="liveQuickAskDesk">
<h2 class="timberGradient">Live Quick Ask Desk</h2>
<div id="innerQuickAskDesk">
<span id="total_user"></span> staff online currently
<button type="button" id="disconnect" class="btn btn-danger">Offline</button>
<div class="col-lg-12" id="messagewindow" style="position: absolute;height:330px;overflow: auto;">
<span id="messages"></span>
</div>
<div class="col-lg-12">
<form style="position: absolute;margin:110% 0 0 0;width:320px;">
<div class="form-group">
<label>Message:</label>
<input type="text" class="form-control" id="m">
</div>
</form>
</div>
</div>
<div class="col-lg-12 center-block" id="connect_div">
<button type="button" id="connect" class="btn btn-primary center-block" style="margin-top: 50%;">Online</button>
</div>
<script src="https://cdn.socket.io/socket.io-1.2.0.js"></script>
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<script>
$("#connect_div").hide();
var socket = io.connect('http://localhost:3000');
var name = "<?php echo $user_name ?>";
$('#disconnect').click(function(){
socket.disconnect();
$("#liveQuickAskDesk").css('background', 'rgba(0,0,0,0.1)');
$("#innerQuickAskDesk").hide();
$("#connect_div").show();
$('#messages').html("");
});
$('#connect').click(function(){
socket = io.connect('http://localhost:3000',{'forceNew':true});
socket.on('connect', function(msg){
socket.emit('join', name);
console.log("client reconnect to the server");
});
$("#liveQuickAskDesk").css('background', 'rgba(0,0,0,0)');
$("#connect_div").hide();
$("#innerQuickAskDesk").show();
});
socket.on('connect', function(msg){
socket.emit('join', name);
console.log("client join the server");
});
socket.on("disconnect", function(){
console.log("client disconnected from server");
});
$('form').submit(function(){
$('#messagewindow').animate({ scrollTop:$('#messagewindow').prop('scrollHeight')}, 10);
socket.emit('chat message', "Staff "+name+": "+$('#m').val());
$('#m').val('');
return false;
});
socket.on('user', function(msg){
$('#total_user').html(msg);
});
socket.on('chat message', function(msg){
$('#messages').append($('<p>').text(msg));
});
</script>
</div>
【问题讨论】:
-
消息不会存储在任何地方,是吗?
-
是的,消息不存储在任何地方,只是正常发送和接收客户端->服务器->客户端
-
你需要一个数据库。您也可以使用全局变量来存储用户消息..
-
是的,将来我会添加一个数据库,但我想知道现在没有数据库可以解决这个问题吗?因为现在不需要存储任何东西,只需在重新连接后追加新消息即可~
-
是否要在重新连接后保留最后一条消息的状态?如果是,那么使用您的方法是不可能的..重新连接后用户将能够发送和接收消息..我想..
标签: javascript jquery socket.io