赞
踩
SockJS回退
在公共Internet上,超出控制范围的限制性代理可能会阻止WebSocket交互,这可能是因为它们未配置为传递Upgrade
header,或者是因为它们关闭了看起来空闲的长期连接。
解决这个问题的方法是WebSocket仿真,即先尝试使用WebSocket,然后再使用基于HTTP的技术来模拟WebSocket交互并公开相同的应用程序级API。
在Servlet堆栈上,Spring框架为SockJS协议提供了服务器(以及客户端)支持。
SockJS简介
SockJS的目标是让应用程序使用WebSocket API,但在运行时需要时,可以返回到非WebSocket的替代方案,而无需更改应用程序代码。
SockJS包括:
以可执行narrated tests的形式定义的SockJS协议。
SockJS JavaScript客户端——浏览器中使用的客户端库。
SockJS服务器实现,包括Spring框架spring-websocket模块。
spring-websocket模块中的SockJS Java客户端(从4.1版开始)。
narrated tests的形式(python实现):
import osimport timeimport jsonimport reimport unittest2 as unittestfrom utils_03 import GET, GET_async, POST, POST_async, OPTIONS, old_POST_asyncfrom utils_03 import WebSocket8Clientfrom utils_03 import RawHttpConnectionimport uuidtest_top_url = os.environ.get('SOCKJS_URL', 'http://localhost:8081')base_url = test_top_url + '/echo'close_base_url = test_top_url + '/close'wsoff_base_url = test_top_url + '/disabled_websocket_echo'cookie_base_url = test_top_url + '/cookie_needed_echo'
SockJS是为浏览器设计的。它使用多种技术来支持多种浏览器版本。传输分为三类:WebSocket、HTTP流和HTTP长轮询。
SockJS客户端首先发送GET /info从服务器获取基本信息。之后,它必须决定使用什么传输工具。如果可能,使用WebSocket。如果不是,在大多数浏览器中,至少有一个HTTP流选项。如果不是,则使用HTTP(长)轮询。
所有传输请求都具有以下URL结构:
https://host:port/myApp/myEndpoint/{server-id}/{session-id}/{transport}
{server-id}对于在集群中路由请求很有用,但不能在其他情况下使用。
{session-id}关联属于SockJS会话的HTTP请求。
{transport}表示传输类型(例如,websocket、xhr-streaming和其他类型)。
WebSocket传输只需要一个HTTP请求就可以完成WebSocket握手。此后的所有消息都在该socket上交换。
HTTP传输需要更多请求。例如,Ajax/XHR流依赖于服务器到客户端消息的一个长时间运行的请求,以及客户端到服务器消息的其他HTTP POST请求。长轮询与此类似,只是它
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。