1

我是 PHP/MySQL 的初学者,也是 javascript 的新手,我想制作一个页面,一个用户可以向另一个用户发送实时请求。例如,UserA 可以看到在线用户列表,并向 UserB(在线)发送请求,UserB 的页面会弹出警报,UserB 可以选择单击是或否。UserA 会收到一个弹出窗口,其中包含 B 的响应(或者如果超时则默认为否)

这通常是怎么做的?我想我的问题有两个部分:

  1. 如何记录在线/离线用户?(我应该有一个记录登录/注销时间的表格吗?)
  2. 通常如何在 2 个用户之间发送消息
4

3 回答 3

4

我不知道您要做什么,但我认为私人聊天是一个很好的例子?我会假装那是你正在做的。

我将尝试在适当的情况下提供大量信息,而不会将其变成完整的教程。期待大量的链接和阅读建议。


理念

您在应用程序的核心有一个基本概念,即用户通信。您需要以某种方式从 HTTP 的无状态、异步世界转到有状态、同步的世界。有几种方法可以做到这一点。

轮询

这是使用AJAX向服务器重复请求信息。AJAX 代表Asynchronous Javascript And XML,不过不用担心 XML 位,这只是历史。基本上,AJAX 就像从浏览器中的脚本发出常规请求一样,这为您提供了无需刷新即可从服务器发送和接收数据的优势。这适用于用户启动或可以处理延迟的情况。对于您的情况,您将标记某人上次执行操作的时间,然后指定一些超时时间来决定某人何时离线。请求的结果包含自检查后可能到达的任何新消息。

长轮询/彗星

这是之前投票思想的延伸。对于基本 AJAX 的客户端启动性质,这几乎是一种明确的解决方法。Comet 本质上只是 AJAX,但您可以使连接保持打开更长的时间,从而允许服务器向下推送信息。您可以在此处找到有关此技术的信息:Comet。但是,这种技术存在一些问题:

  • 片状体验。不同的浏览器会以不同的方式处理长时间打开的连接,这使得为所有浏览器中的所有用户提供一致的体验成为一项挑战。
  • 断开连接。最终出现脱节。最终浏览器调用.abort()请求,你必须重新打开它。
  • 单连接限制。HTTP/1.1 标准规定浏览器在每台服务器上一次只能同时打开一个连接。您可以通过使用多个(子)域来解决此问题。

您必须使用与以前基本相同的技术,因为您仍然有属于正常使用的一部分的断开连接。不同之处在于服务器必须在必要时保持连接打开。根据您在后端使用的技术,这可能是微不足道的,也可能是困难的,如果不小心处理,可能会造成巨大的性能成本。

网络套接字

WebSockets本质上是以前的解决方案,但已标准化并正确实施。WebSockets 的本质是你可以定期向服务器发出请求,但要求升级为 TCP 连接。这里的升级这个词有点误导,因为从技术上讲,它只是从连接中删除 HTTP 内容,并为您留下原始的底层连接。

WebSockets 是为持久连接而设计的,并且是全双工的(双向通信)。

然而,有两个主要缺点:它们是新的,这意味着支持不是那么广泛,大多数现代浏览器都支持它们,但你不能依赖每个人都拥有最新的浏览器。需要服务器端支持。这意味着您必须拥有一个能够升级请求并有效处理它们的系统,因为这是一项新技术,支持有限,socket.io是主要技术。socket.io 是一个 node.js 模块,因此可能不适合您。其他语言/技术也在那里,但可用的支持明显较少。

(编辑:重读你的问题,发现你正在使用 PHP,你可以使用这个库:php-websocket for websockets。我已经测试过了,所以请注意)

使用 WebSockets,您可以将连接断开用作离线信号,您只需根据需要发送数据。但是,如果 WebSockets 不可用,则回退到更旧、更可靠的解决方案是明智的,因此请记住这一点。


您需要解决所有这些解决方案周围的许多问题,但希望这能让您对从何处以及如何开始有所了解。至少它提供了一些你可以用谷歌搜索的短语(或 bing 或 dadduckgo 或询问)!

于 2012-11-09T06:58:05.150 回答
1

您可以让每个用户“轮询”(例如 ajax 调用)服务器查看是否有新消息。但我会查看socket.io或类似的框架。

于 2012-11-09T05:50:46.197 回答
0

1,当某人已经登录时,您将能够知道,您将在从数据库中读取用户名/密码或密码密钥后进行登录验证,因此一旦用户登录,您就可以在数据库中标记它以及服务器中的会话处理

2,为此有两种方法,最先进的是使用网络套接字,这样就不需要轮询,另一种方法是等待ajax/Comet等

我的解释就像从直升机上看你的要求..当你开始阅读上面提到的东西时,会有更多的细节出现......

希望这能回答您的问题谢谢

于 2012-11-09T05:56:07.693 回答