使用Web Sockets通信的协议

15

我正在处理一个带有复杂服务器端组件的客户端项目。客户端将作为移动应用程序在其他环境中部署。

对于客户端与服务器之间的通信,有两种对立的观点:

  • 使用REST
  • 使用WebSockets

个人而言,我不介意采取哪种方法,只要得到的API设计得好,易于理解和可扩展即可。

通过以前在基于复杂C++应用程序上使用TCP套接字的经验,我知道自行制定语法/协议很容易变得不一致、混乱和难以管理。

是否有像REST或SOAP这样的通用风格或协议,用于使用WebSockets的客户端-服务器通信?是否有关于设计自己的客户端-服务器通信方案/协议的指导或最佳实践?

3个回答

12

你看过 WAMP 吗?

从上述页面中可以得知:

WebSocket 协议已经被现代浏览器内置,提供双向、低延迟的基于消息的通信。但是,作为一种底层协议,WebSocket 只提供了原始的消息传递。

现代 Web 应用程序通常需要更高级别的消息传递模式,例如发布订阅和远程过程调用。

这就是 WebSocket 应用程序消息协议(WAMP)的用处所在。WAMP 在一个协议内添加了 RPC 和 PubSub 的更高级别的消息传递模式到 WebSocket 中.

技术上,WAMP 是一个官方注册的 WebSocket 子协议(运行在 WebSocket 之上),使用 JSON 作为消息序列化格式。

WAMP 采用开放的 Web 标准,并旨在易于使用和简单实现。


3

不是有意冒犯你,Jesse,在做了一些研究后我会回答自己的问题。

我没有找到任何REST的等价物。当前的趋势似乎是使用JSON来发送和接收对象。这在JavaScript为主导的世界中似乎很合理,并允许消息在接收时立即更新数据。

例如:

我试着按照这些线路写了自己的协议。然而,我发现最完整定义的协议是 JSON-RPC。该协议的额外优点是,相同的消息系统可以在HTTP和WebSockets上使用,如果您正在编写混合套接字和HTTP应用程序。
我遇到的另一种方法是将现有的消息传递协议“移植”到WebSockets上(无论它们是否使用JSON)。因此,例如,XML-RPC(基于JSON-RPC)可以相对简单地重新实现以用于套接字。事实上,SOAP 也可以在套接字上重新实现。
我通过以上链接之一发现的一个好的、小的协议是 STOMP。那也可以被移植 - 并且 确实已经被移植

0
假设使用Java,我喜欢Cometd(www.cometd.org)作为一种消息机制,它位于诸如http、websocket甚至是spdy或任何新协议之上。这样做的吸引力在于您可以编写针对该API的代码,并且它会无缝地解决给定客户端/服务器组合的最佳底层协议是什么。如果您使用旧版IE,则会回退到普通的http,但如果是新版IE,则可能选择websockets。如果您使用Chrome或Firefox,则会获得spdy,在基于spdy的http / 2.0发布后,您将能够更新cometd并免费获得它。此外,通过在websocket之上使用更高级的协议,您可以获得诸如消息恢复之类的功能,以防止像穿越隧道和失去连接等情况发生。对于聊天应用程序或希望通过有序消息维护状态的应用程序非常有效。我喜欢bayeux协议(这就是cometd实现的内容)的这些特性。

就我个人而言,我并不认为REST和websocket是竞争或对立的关系,它们是不同的实体。REST是HTTP风格无状态环境下产生的解决方案,并玩弄URL约定,而websocket则是HTTP的替代协议。使用REST时,你不太可能关心如何预热TCP连接以获得更好的吞吐量,但在潜在的长连接中,比如websocket或spdy,这些问题变得更加普遍。虽然http/1.1具有管线化的选项,但由于缺乏支持,直到最近移动浏览器开始默认使用它,它才没有达到其潜力。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接