【问题标题】:How to implement jquery/javascript notifications and count from database?如何实现 jquery/javascript 通知并从数据库中计数?
【发布时间】:2012-03-23 17:41:24
【问题描述】:

我想用 jquery、简单的 javascript 和 java 来实现一些东西,但我不知道这样做。

说明:

  • 字母A很简单,我只是描述一下。

A) 用户登录系统,并且他的用户 ID 处于会话中。我想通过单击按钮向另一个用户(用他的用户 ID 标识)发送一条消息,当该过程完成时,数据库表上将有一条新记录,如下所示:

message_id = 1; sender_user_id = xxx; 收件人用户 ID = 年年; 消息 = "你好";

B) 收件人用户如果已登录系统,则必须在几秒钟后消失的 div 上收到类似“嘿,您收到一条新消息”的通知,以及类似的文本“inbox(0)”必须更新为“inbox(1)”。

C) 如果接收用户没有登录,当他决定在任何时候或任何一天进入系统时,通知必须出现并且“收件箱(0)”的文本必须出现更新为第 2 步。

注意事项:

  • 我想到了很多想法,比如在 java 中做一些 servlet,它从 db 返回消息计数,这是由 jquery 帖子打印的。但是,我如何才能在消息到达的那一刻或用户在长时间不活动后登录系统时准确地实现这一点。

  • 我还想到了来自 javascript 的 setInterval,但假设我将间隔编程为每 5 秒检查一次是否有新消息,如果用户发送它并只用了 2 秒会发生什么。我认为会发生延迟。

那么,最好的方法是什么?

提前致谢。

【问题讨论】:

标签: java javascript jquery servlets


【解决方案1】:

唯一的缺点是并非所有浏览器都支持 WebSockets,长轮询等的行为因浏览器而异,最好的办法是使用适用于所有浏览器的 socket.io,它主要是为 nodejs 开发的,但也有java实现...

Socket.io 服务器:https://github.com/Ovea/Socket.IO-Java Socket.io 客户端:https://github.com/Gottox/socket.io-java-client

官方网站:http://www.socket.io/ -> 所有示例均基于nodejs

【讨论】:

    【解决方案2】:

    有一些可用的技术:

    • 投票(你说这个)
    • Coment,一个保持 http 连接打开的“长”轮询。
    • HTML5 Web Scokets

    轮询很容易,其他两个需要一些经验才能在服务器上正确设置它们。如果操作不当,同时保持数百个打开的连接可能有点浪费资源。

    【讨论】:

    • 一个简短的说明:我建议使用状态标志扩展数据库表,以跟踪消息是否已被阅读。
    • 您知道有关此案例轮询的任何示例或演示吗?我将阅读有关彗星的信息,但您知道这一切是否可以与 Tomcat 7 一起使用吗? HTML5 也不是一个好的选择,因为它并非在所有浏览器中都支持。我发现了一个名为“socked.io”的东西,但我不知道如何使用它,而且我认为这需要 nodejs 并且一切都变得复杂:-)
    • 轮询是一个简单的 AJAX 调用:“我的最后一条消息是 #30213。有什么新消息给我吗?”。剩下的就是一个简单的数据库查询。
    【解决方案3】:

    这是在 C# 中...但您可以轻松地转换它。无论如何,here 是我在 C# 中用于长轮询的一些类。基本上有6个类(见下文):

    • 控制器:处理创建有效响应所需的操作(数据库操作等)
    • 处理器:管理与网页(本身)的异步通信
    • IAsynchProcessor:服务处理实现此功能的实例 界面
    • 服务:处理实现 IAsynchProcessor 的请求对象
    • 请求:包含您的响应(对象)的 IAsynchProcessor 包装器
    • 响应:包含自定义对象或字段

    ...我用它来创建一个聊天应用程序。

    【讨论】:

      【解决方案4】:

      如果消息传递的速度无关紧要(例如,即时更新或延迟更新),我建议进行轮询。

      执行此操作的最简单方法如下。 在客户端,每分钟/30 秒发送一次 AJAX 请求。如果响应包含消息(即带有message 属性的 JSON 响应),则更新用户界面(消息计数器)并显示一些弹出窗口。否则什么也不做(如果您的回复状态为no new messages,则将inbox(x) 转为inbox(0)

      另外,一个好的解决方案是跟踪用户对新消息的点击(在弹出窗口或收件箱中)并使用user_id=<user_id>&message=<message_id>status=read 之类的内容发送 AJAX POST 请求(我建议您设置状态字段,因为也许将来您将允许用户在不刷新页面的情况下删除他们的消息/将已读消息标记为未读)。

      在服务器端,脚本(AJAX 请求被发送到)应该检查用户(识别用户的方法取决于您)并返回带有status=<unread_marker> and user_id=<current_user_id> 的所有消息。然后将答案包装成您想要的格式(最简单的格式是 JSON,正如我所建议的)并做出响应。所有其他操作(即更新消息状态)都以相同的方式完成。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-22
        • 2012-09-17
        • 1970-01-01
        • 1970-01-01
        • 2018-08-07
        • 1970-01-01
        • 2022-01-15
        • 1970-01-01
        相关资源
        最近更新 更多