【发布时间】:2014-06-24 04:41:04
【问题描述】:
我正在尝试创建一个使用普通轮询的 Laravel 4 聊天应用程序。到目前为止它工作正常但是当我在两个不同帐户的两个浏览器中测试它时,我发现当我尝试同时从每个客户端(浏览器)发送消息时,客户端 B 收到客户端 A 的消息但客户端 A 确实没有收到客户 B 的消息。刷新当然会在客户端 A 中加载客户端 B 的消息。我该如何解决?
我使用普通轮询而不是长轮询的原因是因为并发连接问题,即一些旧版浏览器仅限制为 2 个并发连接。此聊天应用程序计划在单个聊天会话中容纳最多 25 个用户。由于遗留浏览器问题,我也无法使用网络套接字。如果我错了,请纠正我。
附言更好的方法来实现这一点的奖励积分!谢谢!
这是我更新消息的客户端(Javascript)代码。
updatemessages(){
...
$.ajax({
type: "POST",
url: 'create/populate',
data: {
'from': lastMessages,
'conv_id':conv_id
},
success: function(messages) {
$.each(messages, function() {
appendMessage(this);
});
},
error: function(xhr,textStatus,errorThrown) {
console.log(xhr.responseText);
console.log('something went wrong!');
$(this).abort();
},
complete: function() {
window.setTimeout(updateMessages, 2000);
},
dataType: 'json'
});
}
updatemessages();
这是我的服务器代码(控制器),它接收消息,将其与我的数据库中的最新消息进行比较,如果找到最新消息,则检索它。
public function index()
{
$timestamps = Input::get('from'); //get timestamp of AJAX sent message
$conv_id = Input::get('conv_id'); //get conversation id of AJAX sent conv_id
$allMessages = Messages::with('User')->whereIn('conv_id',$conv_id);
if(is_null($timestamps)){
$messages = Messages::with('User')->whereIn('conv_id',$conv_id)->orderBy('created_at','desc');
}else{
asort($timestamps);
$messages = $allMessages->where('created_at','>',end($timestamps));
}
return $messages->get()->reverse();
}
这是另一个将新消息存储到数据库中的代码。
public function store()
{
$body = Input::get('message');
$user_id = Input::get('user_id');
$conversation = null;
$conv_id = Input::get('conv_id');
return Messages::create(array('body'=>$body,'conv_id'=>$conv_id,'user_id'=>$user_id));
}
【问题讨论】: