为什么’;Web套接字是否使用SOAP?

为什么’;Web套接字是否使用SOAP?,soap,html,websocket,Soap,Html,Websocket,首先,我无意敌意或疏忽,只想了解人们的想法。我正在研究客户端和服务器之间的双向通信;客户端是一个web应用程序。在这一点上,我有几个选择:MS专有双工绑定,我听说这是不可靠和不自然的:comet和web套接字(用于受支持的浏览器) 我知道这里有人以其他方式问过这个问题,但我有一个更具体的方法问题。考虑到web套接字是客户端的,客户端代码位于JavaScript中。是否真的打算直接用JavaScript构建应用程序的一大块?为什么W3C没有在web服务中这样做?如果我们能够使用SOAP来提供契约并

首先,我无意敌意或疏忽,只想了解人们的想法。我正在研究客户端和服务器之间的双向通信;客户端是一个web应用程序。在这一点上,我有几个选择:MS专有双工绑定,我听说这是不可靠和不自然的:comet和web套接字(用于受支持的浏览器)

我知道这里有人以其他方式问过这个问题,但我有一个更具体的方法问题。考虑到web套接字是客户端的,客户端代码位于JavaScript中。是否真的打算直接用JavaScript构建应用程序的一大块?为什么W3C没有在web服务中这样做?如果我们能够使用SOAP来提供契约并定义事件以及所涉及的现有消息传递,这不是更容易吗?到目前为止,感觉就像是棍子的短端

为什么不简单一点,利用JS的动态特性,把大部分代码放在服务器上

而不是

mysocket.send("AFunction|withparameters|segmented");
我们可以说

myServerObject.AFunction("that", "makessense");
...
myServerObject.MeaningfulEvent = function(realData) { alert("Since I have realistic data....");  alert("Hello " + realData.FullName); }
...
而不是

...
mysocket.onmessage = function() { alert("yay! an ambiguous message"); }
...
我们可以说

myServerObject.AFunction("that", "makessense");
...
myServerObject.MeaningfulEvent = function(realData) { alert("Since I have realistic data....");  alert("Hello " + realData.FullName); }
...

HTML5花了很长时间才站稳脚跟……我们是否在错误的方向上浪费了大量的精力?想法?

WebSocket允许从服务器发出请求,从而使Comet和所有其他HTTP推送类型技术清晰易懂。它是一种沙盒套接字,给了我们有限的功能

然而,API足够通用,框架和库作者可以用他们想要的任何方式改进接口。例如,您可以在WebSocket之上编写一些RPC或RMI样式的服务,允许通过网络发送对象。现在,它们在内部以某种未知的格式被序列化,但是服务用户不需要知道也不关心

所以从规范作者的角度考虑,从

mysocket.send("AFunction|withparameters|segmented");


这相对简单,需要在WebSocket周围编写一个小包装器,以便对应用程序进行不透明的序列化和反序列化。但是,相反的方向意味着规范作者需要做一个更复杂的API,这使得编写代码的基础更加薄弱。

JavaScript允许客户端通过HTTP与XMLHttpRequest进行通信。WebSockets扩展了这个功能,允许JavaScript进行任意网络I/O(不仅仅是HTTP),这是一个逻辑扩展,允许所有需要使用TCP流量(但可能不使用HTTP协议)的应用程序移植到JavaScript。我认为,随着应用程序继续向云端移动,HTML和JavaScript支持桌面上的所有可用内容是合乎逻辑的

虽然服务器可以代表JavaScript客户机执行非HTTP网络I/O,并通过HTTP提供通信,但这并不总是最合适或最有效的方法。例如,在尝试制作在线SSH终端时,增加额外的往返成本是没有意义的。WebSockets使JavaScript可以直接与SSH服务器通信


至于语法,它的一部分基于XMLHttpRequest。正如在另一篇文章中指出的,WebSockets是一个相当低级的API,可以用一个更容易理解的API来包装。WebSockets支持所有必要的应用程序比它拥有最优雅的语法更重要(有时关注语法会导致更严格的功能)。库作者总是可以使这个非常通用的API对其他应用程序开发人员更易于管理。

正如您所注意到的,WebSocket的开销很低。开销与普通TCP套接字类似:与AJAX/Comet的数百字节相比,每帧只多出两个字节

为什么选择低级别而不是某种内置的RPC功能?一些想法:

  • 采用现有的RPC协议并在低级套接字协议上对其进行分层并不难。如果假定RPC开销,则不能反向构建低级连接

  • WebSockets支持在服务器端添加到多种语言中非常简单。有效负载只是一个UTF-8字符串,几乎每种语言都有内置的高效支持。一个RPC机制并没有那么多。如何处理Javascript和目标语言之间的数据类型转换?您需要在Javascript端添加类型提示吗?那么变长参数和/或参数列表呢?如果语言没有一个好的答案,你会构建这些机制吗?等等

  • 它将模仿哪种RPC机制?您会选择现有的(SOAP、XML-RPC、JSON-RPC、JavaRMI、AMF、RPyC、CORBA)还是全新的

  • 一旦客户机支持变得相当普遍,那么许多具有普通TCP套接字的服务将添加WebSocket支持(因为添加WebSocket非常简单)。如果WebSocket是基于RPC的,则情况并非如此。一些现有的服务可能会添加一个RPC层,但在大多数情况下,WebSockets服务将从头开始创建

对于我的项目(仅使用Javascript、Canvas和WebSockets的VNC客户端),WebSockets的低开销特性对于实现合理的性能至关重要。在VNC服务器包括WebSocket支持之前,noVNC包括wsproxy,它是一种通用的WebSocket到TCP套接字代理

如果您正在考虑实现一个交互式web应用程序,而您还没有决定使用服务器端语言,那么我建议您看看哪一个是(使用Google的V8引擎的服务器端Javascript)的库

除了node的所有优点(双方语言相同、效率很高、电源库等),Socket.IO还提供了以下几点:

  • 提供用于处理连接的客户端和服务器框架库

  • 检测支持的最佳传输b
    WebSocket
    --------- (sits atop)
    TCP