-1

我是php/mysql 的新手,决定实现一个简单的聊天应用程序。这里有一些具体的问题..


1) 在 facebook 中,如果我发送聊天消息,它会使用 javascript 更新聊天日志,但如果连接丢失,它也会在一段时间后出现“发送失败”标记。我的问题是如何在使用 AJAX/jquery 发送消息之前检查是否建立了与服务器的连接,以便我也可以通知用户他的消息没有传递。


2)考虑这个简化的场景..聊天室有2个插槽,即只有2个人可以共享聊天室并随时互相聊天..如果第三个用户尝试登录,他会被告知聊天室爆满。我可以将用户的登录数据存储为会话变量或类似的东西。我的问题是……如果 2 个人已经在聊天,而一个人只是关闭浏览器而没有注销或类似的事情……在这种情况下,会话变量仍然存在,应用程序仍然认为 2 人正在聊天房间.. 如果用户在浏览器窗口中未处于活动状态,如何删除会话变量并为第三个人腾出空间?


3) 聊天应用程序(如 fb chat 和 google chat)如何更新他们的聊天记录?他们是请求整个聊天记录(比如由 10 条消息组成)还是只使用 AJAX 请求当前消息?每个请求的理想持续时间是多少?我正在使用 1 秒...

4

2 回答 2

1

我认为大多数聊天应用程序都没有使用 ajax。ajax 的问题是服务器没有直接向客户端发送消息的机制。如果您使用 ajax,则每个客户端都必须定期检查服务器。

解决此问题的方法是websockets或长轮询。查看棘轮它是 php 的 websockets。


如果你坚持使用 ajax,你可以:

  1. 在提交时附加一个类到存储消息的 div 上class='ephemeral'。如果ajax失败只是$('.ephemeral').append('failed')
  2. 这可以通过使用 ajax 调用不断 ping 服务器来解决,如果客户端在客户端断开连接的最后 5 秒内没有 ping 服务器。
  3. 您可以只向服务器发送您收到的最新聊天消息的时间,并让它从数据库中提取,仅在该时间之后进行聊天。这需要将每个聊天保存为数据库中的单独行。
于 2012-12-02T06:14:59.470 回答
1

1)在 jquery ajax 回调函数中告诉你是否发生错误:

$("#form").submit(function(){
    $.post("post.php", {
        message: $('#field').val(),
    }, function(data, status){
        alert("success");
    }).error(function(){
        alert(error);
    });
});

http://api.jquery.com/jQuery.post/

2)您可以定期轮询(如每分钟)服务器,如果用户不联系服务器,则在触发 onunload 时销毁他的会话或向服务器发送断开连接命令(不太可靠)。

3)我会向服务器发送最后一张图片的时间戳或ID,然后它会向我发回所有消息。

这取决于您希望聊天的“实时”程度。1 秒到 10 秒是理想的。

于 2012-12-02T06:22:41.853 回答