websocket 双向概念如何工作?

GMs*_*soF 2 java sockets tomcat websocket

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

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

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

Den*_*ret 6

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

底层套接字只是保持打开状态(如果无法保持打开状态,则在需要时重新打开)。请注意,HTTP 1.1 还做到了这一点

HTTP/1.1 是原始 HTTP (HTTP/1.0) 的修订版。在 HTTP/1.0 中,每个资源请求都会与同一服务器建立单独的连接。HTTP/1.1 可以在页面交付后多次重用连接来下载图像、脚本、样式表等。因此,HTTP/1.1 通信的延迟时间较短,因为 TCP 连接的建立会带来相当大的开销。

它必须在客户端和服务器端进行处理。当然,这意味着这两个软件都要更新(旧浏览器和旧服务器无法处理 websocket)。

编辑(以下评论中的交流):

客户端,这是初始化连接的方式:

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
};
Run Code Online (Sandbox Code Playgroud)

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

ws.send(window.JSON.stringify(msg)); // msg is a basic js object
Run Code Online (Sandbox Code Playgroud)