在所有Web浏览器使用时,威尔网络插口使AJAX过时了吗?

因为如果我可以使用网络套接字来获取实时数据和更新数据,为什么我需要阿贾克斯?即使我使用Ajax只是一次获取应用程序启动时我还是会想看看这个数据已经一段时间后更改的数据。

,并且将网络套接字的横域或仅到相同的原点可能呢?

有帮助吗?

解决方案

的WebSockets不会使AJAX完全过时,的WebSockets可以做跨域。

AJAX

AJAX机制可以用普通的网络服务器使用。在最基本的层面,AJAX只是对网页进行HTTP请求的方式。的WebSockets是一个更低层协议,并且需要的WebSockets服务器(内置于网络服务器,独立,或从web服务器代理到一个独立的服务器)。

使用的WebSockets,成帧和有效载荷是由应用程序确定的。您可以发送HTML / XML / JSON客户端和服务器之间来回,但你不会被强迫。的 AJAX是HTTP 即可。的WebSockets具有HTTP友好握手,但<强>的WebSockets不是HTTP 即可。的WebSockets是双向协议的更靠近原始套接字(有意如此)比它是HTTP。所述的WebSockets有效载荷数据是UTF-8在标准的当前版本中的编码但这是有可能改变的/扩展在将来的版本。

于是就有可能永远是AJAX类型的请求,即使在这个世界上,所有的客户端都支持WebSockets的原生的地方。的WebSockets正在设法解决的情况下AJAX是不能或勉强能(因为它的WebSockets双向和低得多的开销)。但是,的WebSockets不会取代一切AJAX的用途。

跨域

下,支撑件的WebSockets跨域。初始握手设置连接通信的起源策略信息。维基百科页面显示了一个典型的握手的示例: http://en.wikipedia.org/wiki/WebSockets

其他提示

我会尝试打破这种分解成问题:

  

在所有Web浏览器使用时,威尔网络插口使AJAX过时了吗?

绝对不是。 WebSockets的是原始套接字连接到服务器。这种带有它自己的安全问题的。 AJAX调用只是异步。 HTTP请求可以按照相同的验证过程作为网页的其余部分。

  

因为如果我可以使用网络套接字来获取实时数据和更新数据,为什么我需要阿贾克斯?

您将使用AJAX更简单更易于管理的任务。不是每个人都希望有一个固定插座式连接器,以简单地允许异步请求的开销。可处理简单地不够。

  

即使我使用Ajax只是一次获取应用程序启动时我还是会想看看这个数据已经一段时间后更改的数据。

当然,如果数据被改变即可。你可能没有足够的数据改变或不断刷新。再次,这是代码开销,你必须考虑到。

  

,并且将网络套接字的横域或仅到相同的原点可能呢?

您可以跨域的WebSockets,但你必须编写你的WS服务器接受他们。您可以访问域(主机)标头,然后您可以使用接受/拒绝请求。这可以,但是,通过一些简单的nc被欺骗。为了真正确保连接则需要通过其他方式验证连接。

的WebSockets有几个大的缺点的可扩展性的AJAX避免的条款。因为Ajax发送请求/响应并关闭连接(..或之后不久)如果网页怠速时它不使用服务器资源上有人入住。的WebSockets是为了流数据返回给浏览器,他们占用服务器资源这样做。服务器在他们有多少并发连接可以在同一时间保持开放的限制。不依赖于你的服务器端技术提,他们可能会占用一个线程来处理套接字。因此,有的WebSockets每个连接双方资源较多的要求。你可以很容易地用尽所有线程的客户提供服务,然后再没有新的客户端可以进来,如果很多用户都只是坐在在页面上。这是的NodeJS,vertx,网状真的可以帮忙,但即使是那些有上限为好。

还有就是基础套接字的状态的问题,并写上双方是在有状态会话这是不是你有Ajax风格的,因为它的无状态做一些携带的代码。 WebSockets的需要创建这是帮你解决了与阿贾克斯低级别的协议。比如像心脏的跳动,关闭空闲连接,在重新连接错误等,现在是非常重要的。这些都是你没有使用AJAX的时候,因为它是无状态的解决。国家是你的应用程序的稳定性,更重要的是健康的你的服务器非常重要。这不是小事。预HTTP我们内置了很多有状态TCP协议(FTP,TELNET,SSH),然后HTTP发生。没有人做的东西太多了,因为即使有它的局限性HTTP令人惊奇的更简单,更稳健。的WebSockets带回好和状态协议的坏。您将学习很快,如果你没有得到一个剂量,去年去的身边。

如果您需要实时流数据的这种额外的开销是必要的,因为轮询服务器以获取流数据较差,但如果你正在做的是用户interaction->请求 - >应答为>更新UI,然后阿贾克斯更容易并且将使用更少的资源,因为一旦响应发送通话结束后并没有额外的服务器资源的使用。所以,我认为这是一个权衡和建筑师必须决定哪些工具适合他们的问题。 AJAX有它的位置,并且具有的WebSockets自己的位置。

<强>更新

所以你的服务器的体系结构是,当我们在谈论线程最重要的。如果您使用的是传统的多线程服务器(或程序),其中每个插座连接都有自己的线程来响应请求,然后WebSockets的问题很多给你。因此,对于每一个方面,我们有一个插座,并最终操作系统将倒下,如果你有太多的这些,同样也适用于螺纹(更因此对工艺)。线程是比插座较重(在资源方面),所以我们尽量节省多少线程,我们同时运行。这意味着创建一个线程池,这仅仅是一个被所有插座之间共享线程的固定数量。但是一旦套接字被打开线程用于整个对话。这些对话的长度支配,你很快就能重新规划这些线程在即将到来的新的套接字。您的通话支配着多少,你可以扩展的长度。不过,如果你是流这种模式不适合缩放很好地工作。你必须打破线程/插座设计。

HTTP的请求/响应模型使得它在翻转线程新的套接字非常有效的。如果你只是要使用请求/响应HTTP使用其已建成的,比的WebSockets重新实现类似的东西要容易得多。

由于的WebSockets不必是请求/响应HTTP和如果服务器在其线程池中的线程的固定数量可以流式传输数据,并且您具有相同数量的的WebSockets吨颖你所有的线程与积极的对话,你不能服务于新客户来了!您已达到最大容量。这就是协议的设计是使用WebSockets和线程太重要了。您的协议可以让你放松每座每会话模型线程这样的人只是坐在那里不使用服务器上的一个主题。

这就是异步单个线程的服务器进来。在Java中,我们经常称之为NIO非阻塞IO。这意味着它是其中发送和接收数据不会阻止执行调用的线程插座不同的API。

因此,在阻止套接字,当你调用socket.read传统()或socket.write(),他们等待,直到接收到数据或控制权返回给程序之前发送。这意味着你的程序被卡住等待套接字数据进来或走出去,直到你可以做其他任何事情。这就是为什么我们有线程,以便我们可以做工作,同时(同时)。而我从客户端数据等待Y.并发操作是游戏的名称,当我们谈论这个服务器发送数据到客户端的X。

在一个NIO服务器,我们使用一个线程来处理所有客户端和注册回调当数据到达通知。例如

socket.read( function( data ) {
   // data is here! Now you can process it very quickly without waiting!
});

在socket.read()调用将立即返回,而不读取任何数据,但我们提供我们的函数,当谈到将被调用。这种设计从根本上改变你如何建立和建筑师你的代码,因为如果你先挂了等待是你无法接收任何新的客户。你有一个单独的线程,你真的不能做两件事情,在一次!你必须保持一个线程移动。

NIO,异步IO,因为这是全称为基于事件的程序,是一个更复杂的系统设计,我不会建议你尝试写这个,如果你开始了。即使是很高级的程序员发现它很难建立一个强大的系统。既然你是异步的,你不能调用的API块。像从DB中读取数据或将消息发送到其他服务器必须被异步地执行。即使读/来自文件系统写入可以减缓你的单线程下降低您的可扩展性。一旦你去异步它的所有异步所有的时间,如果你想保持单线程移动。这就是它被挑战,因为最终你会碰到一个API,如数据块,这不是异步的,你必须在一定程度上采取更多的线程。因此,一个混合方法,即使在非同步世界是常见的。

好消息是有使用已经建立了,你可以使用这个较低的水平API的其他解决方案。的NodeJS,Vertx,Netty中,Apache的米纳,游戏框架,扭曲的Python,Stackless的Python等有可能是C ++的一些不起眼的图书馆,但老实说,我不会理会。服务器技术不需要非常最快的语言,因为它的IO势必超过CPU的约束。如果你是一个死忠的性能螺母使用Java。它的代码庞大的社区,从拉,它的速度是非常接近(有时优于)C ++。如果你只是恨它去与节点或Python。

是,是它的作用。 :d

在更早的答案缺乏想象力。我看没有更多的理由来使用AJAX如果WebSockets的提供给你。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top