2

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

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

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

4

1 回答 1

6

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

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

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

它必须在客户端和服务器端都进行处理。当然这意味着这两个软件都需要更新(旧的浏览器和旧的服务器不能处理 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
于 2012-09-11T09:29:57.277 回答