使用 JavaScript 的 AJAX 和客户端-服务器架构

2024-01-01

我必须对网站进行编程,但我不喜欢静态 HTML 性质。我更喜欢客户端-服务器架构。

现在我发现,使用 XMLhttp,您基本上可以动态更新页面并向服务器发送/请求信息/操作。所以这基本上涵盖了客户区域。

但为了完成客户端-服务器架构,服务器也需要发送/请求信息而不被查询。

有没有什么办法,例如对于聊天服务器来说,可以将收到的消息发送回所有客户端(客户端使用网络浏览器),而客户端不必以固定的时间间隔进行查询?我想实现当你输入内容时人们可以看到。


有几种不同的方法可以实现这一点。其中一些已经在这里得到了回答,但我想包括更多一些以及我对它们的想法。

1. 投票

频繁向服务器发出请求以检查新信息。这是最糟糕的方法,但可能是最简单的方法。如果您的网站的用户数量较少,那么这样做可能值得。

这可以通过使用来完成setInterval(myFunction, n)在 JavaScript 中发送XMLHttpRequests到服务器每隔n毫秒。然后,在服务器上,您可以使用新信息(当您拥有新信息时)或一些暗示没有新信息的消息来响应此信息。

2. 长轮询

加载页面时,它会向服务器请求新信息。服务器保持连接打开,直到有东西要发回。此方法减少了使用的网络流量,但增加了服务器上使用的资源。您可以将其用于少量用户,但它的扩展性不太好。

最简单的方法是让处理 AJAX 请求的页面简单地等待新信息可用,然后做出响应。这可能会占用服务器上的大量连接。所以,请谨慎使用。

3. COMET

COMET http://ajaxian.com/archives/comet-a-new-approach-to-ajax-applications基本上是长轮询,但服务器已正确设置。它知道这些连接不是“真实的”,并且它使用更少的资源来处理它们。这是解决此问题的一个很好的解决方案,但它需要为此目的明确设置服务器。有 COMET 服务器和其他流行服务器的 COMET 插件,但它需要一些设置,有时还需要一些钱。

在 .NET 上实现这一点并不是世界上最简单的事情。您可以付费购买解决方案,尝试找到其他人执行类似操作的代码,或者尝试自己编写。我还没有找到任何合适的免费解决方案。如果其他人有,请评论。

4. RIA

另一种解决方案是在页面上包含 Flash、Silverlight 或 Java Applet。人们通常通过使用 1x1 对象来做到这一点,以便他们可以使用 Flash 或 Silverlight 与服务器通信。如果您不介意添加依赖项,这是一个不错的解决方案。如果您已经了解 Silverlight 或 Flash,那么实现起来可能相对简单。

您可以在互联网上找到每个选项的教程。

5. 网络套接字

如果您处于最前沿,您可以查看网络套接字 http://dev.w3.org/html5/websockets/。它仅在最新版本的现代浏览器中可用。它是 HTML5 的一部分,但现在可能是它自己的规范。无论如何,这意味着旧版浏览器将无法处理它。但是,如果您不介意限制自己使用最新的浏览器,则可以使用这个令人惊叹的功能。

我相信Chromium http://blog.chromium.org/2009/12/web-sockets-now-available-in-google.html是目前唯一支持它的浏览器。不过,我们正在努力在 Firefox 和 WebKit 中实现这一点。

我会让你免于争议,只是说这正是你想要的。规范的摘要说明了一切。

该规范定义了一个 API,使网页能够使用 Web Sockets 协议与远程主机进行双向通信。

特别提及

如果您对 Node JS 世界感兴趣,那么您不会出错套接字IO http://socket.io/。它将实现浏览器可用的最佳技术。

结论

最好的选择是 Node JS 上的 Socket.IO。但是,对于 ASP.Net 解决方案,如果可以的话,请选择 COMET 或 Web Sockets。否则,使用 Flash/Silverlight 并不可怕。最后,轮询和长轮询应该是最后的手段。您始终可以支持其中一种,如果客户端浏览器不支持,则可以回退到另一种。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 JavaScript 的 AJAX 和客户端-服务器架构 的相关文章

随机推荐

  • 交换两列 - awk、sed、python、perl

    我有一个大文件中的数据 280 列宽 700 万行长 我需要交换前两列 我想我可以使用某种 awk for 循环来执行此操作 打印 2 1 然后打印到文件末尾的范围 但我不知道如何执行范围部分 而且我无法打印 2 1 美元 3 美元 280
  • 在 API 加载之前在 Cordova 中显示 webView

    我正在使用 PhoneGap Cordova 构建适用于 iOS 和 Android 的应用程序 按照标准行为 在 JavaScript 初始化并且 Cordova API 准备就绪之前 不会显示 webView 所以直到我打电话 docu
  • jquery 添加类到这个被点击的元素

    我生成几行 tr 与任务 现在 可以通过单击某个任务将每个任务标记为完成span 我通过 ajax 请求来做到这一点 这是 HTML table tr td 1 td td span class icon complete a to hea
  • foreach 循环和 stdclass 对象

    我在这里看到了类似的问题 但我似乎无法将解决方案应用于我的问题 我有一个名为 results 的变量 它是从 API 获得的 我将更改专有名词以保护我工作的客户 stdClass Object out gt stdClass Object
  • Laravel 混合编译依赖

    我正在尝试使用vuex 模块装饰器 https github com championswimmer vuex module decoratorsLaravel Mix 项目中的库 使用 TypeScript 但我不断收到错误Uncaugh
  • 比较两个 OpenCV 图像/2D Numpy 数组

    我刚开始使用 OpenCV Python 和 Numpy 但已经成为 Java C C 程序员有一段时间了 我正在实现一个 sigma delta 背景检测器 它执行以下操作 设 i1 为第一张图像 设 i2 为第二张图像 for each
  • 将字节数组插入 List 的最简洁方法?

    在某些代码中 我正在创建一个字节列表 并希望在构建它时将一个字节数组插入到该列表中 这样做最干净的方法是什么 请参阅下面的代码 谢谢 public class ListInsert public static byte getData re
  • 安装 MvcScaffolding 包时 NuGet 执行策略错误

    我在项目中使用 Visual Web Developer Express 2010 Windows XP 和 ASP NET MVC4 RC 我安装了 NuGet v2 0 30619 9119 我现在尝试通过 NuGet 包管理器控制台安
  • 在运行脚本的页面上查找 xpath

    我正在尝试使用硒抓取网页 通过检查页面并右键单击建议的 xpath 属于不稳定类型 html body table 2 tbody tr 1 td form table tbody tr 2 所以我尝试了以下解决方案 driver webd
  • 当我们可以创建 String s = "abc" 时,需要什么 String s = new String("abc")

    据我的理解 String s new String abc 将创建两个对象 字符串常量池中的一个 如果 abc 尚未在常量池中 堆内存中的一个 尽管对于实际将创建多少对象以及在何处创建存在多种理解 无论如何 我有以下问题 为什么 Strin
  • 在 NodeJS 中从 Base64 字符串创建图像

    我正在尝试上传从画布中提取并通过 ajax 发布的图像 但在服务器端创建图像文件时遇到问题 我有以下这个答案 https stackoverflow com a 7347358 1358670 https stackoverflow com
  • 在django中使用聚合获取最小值字段名称

    我有一个模型 其中包含如下所示的一些字段 class Choclate models Model name models CharField max length 256 price models IntegerField 所以我想获取具有
  • 将日期时间指定为索引不会给出 DatetimeIndex

    我的 df 有一个名为 天 的字段 我需要从 天 和开始日期创建一个日期时间 可能很麻烦 但它有效 for t in df index df loc t date datetime date startdate datetime timed
  • NLog 不写入调试消息

    在我的代码中我有一些信息消息 例如logger Log dwewe and logger Debug ddddf 问题是即使我在 VS 中调试 调试消息也不会被写入
  • Visual Studio 2017 无法脱机安装,并显示“无法下载安装文件”

    因此 我使用以下命令在我的笔记本电脑上创建了 VS 2017 Community 的离线安装 vs community exe layout D Downloads VS Community 2017 lang en US add Micr
  • 在 Windows 上使用 SQLCipher 编译 SQLite

    我正在关注this http groups google com group sqlcipher browse thread thread 55c6296b56bf4533在 Windows 上使用 SQLCipher 编译 SQLite
  • 如何理解elf中Program Headers中Offset和VirAddr的区别?

    有一个共享库elf文件 我使用readelf l查看程序头 输出为 Elf file type is DYN Shared object file Entry point 0x0 There are 11 program headers s
  • 指定容器类型的迭代器类型的部分特化

    我有一个模板结构 它接受模板参数的迭代器类型 现在我需要将该类专门用于不同容器的迭代器 我尝试过 std vector template
  • 创建上下文失败 0x3005

    我有 Windows 8 适用于 Windows 32 位的 Eclipse IDE for Java Developers JUNO 以及更新和安装的适用于 Windows 的 Android SDK 4 1 2 我已经解压了适用于 Wi
  • 使用 JavaScript 的 AJAX 和客户端-服务器架构

    我必须对网站进行编程 但我不喜欢静态 HTML 性质 我更喜欢客户端 服务器架构 现在我发现 使用 XMLhttp 您基本上可以动态更新页面并向服务器发送 请求信息 操作 所以这基本上涵盖了客户区域 但为了完成客户端 服务器架构 服务器也需