websocket 双向概念是如何工作的?

Posted

技术标签:

【中文标题】websocket 双向概念是如何工作的?【英文标题】:How the websocket bi-directional concept work? 【发布时间】:2012-09-11 09:28:08 【问题描述】:

我使用 Java Tomcat 作为 websocket 服务器。

我认为 websocket 和 http 流(我不是指轮询和长轮询)之间的主要区别是 websocket 允许双向通信,这类似于通常的原始套接字编程。 (以上是我的理解,可能有误,欢迎指正。)

我的问题是网络客户端(浏览器)如何通过已经打开的网络套接字继续发送另一个请求?通常的http请求会将另一个请求视为新的套接字连接,但websocket不会,这就是为什么我很困惑,它是如何实现的?应该在Server端还是Client(浏览器)端处理?

【问题讨论】:

【参考方案1】:

是的,websocket 是双向的。一个重要的结果是您可以有效地将数据从服务器推送到客户端。

底层套接字只是保持打开状态(如果无法保持打开状态,则在需要时重新打开)。请注意,HTTP 1.1 尚未 did that :

HTTP/1.1 是原始 HTTP (HTTP/1.0) 的修订版。在 HTTP/1.0 中 为每个资源建立到同一服务器的单独连接 要求。 HTTP/1.1 可以重用一个连接多次下载 页面完成后的图像、脚本、样式表等 发表。因此 HTTP/1.1 通信的延迟更少 因为 TCP 连接的建立提出了相当大的 开销。

它必须同时在客户端和服务器端处理。当然,这意味着这两个软件都需要更新(old browsers 和旧服务器无法处理 websockets)。

编辑(在评论交流后):

客户端,这是如何初始化连接的:

var ws = new WebSocket('ws://'+document.location.host+'/ws');
ws.onopen = function() 
       // do something
;
ws.onerror = function() 
       // do something
;
ws.onclose = function() 
       // do something
;
ws.onmessage = function(msgevent) 
    var msg = JSON.parse(msgevent.data);
    // handle incoming message
;

你保留 ws 变量,然后你可以使用相同的连接从客户端推送到服务器

ws.send(window.JSON.stringify(msg)); // msg is a basic js object

【讨论】:

那么,它可以允许将数据从服务器推送到客户端,那么从客户端到服务器呢?既然是双向的,就应该允许这样做吧? 当然。我提到了从服务器到客户端的推送,因为在 websocket 协议之前,这很难以一种标准且有效的方式实现。 我明白了...但是客户端如何将数据推送到服务器?在 Java 原始套接字编程中,我知道如何实现这一点。但是对于网络浏览器,客户端如何重用同一个套接字呢? 我明白了……这个概念现在更清晰了……从来没有想过 javascript 是将数据从客户端推送到服务器的主要人员……

以上是关于websocket 双向概念是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

带有 Nao 机器人的 Websocket 双向概念

WebSockets Tutorial(教程一)————WebSockets简介

websockets如何详细工作?

WebSocket原理及如何使用

Android最佳实践——深入浅出WebSocket协议

微信小程序webSocket多人通信案例