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

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

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

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

【问题讨论】:

    标签: java sockets tomcat websocket


    【解决方案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 是将数据从客户端推送到服务器的主要人员……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 2015-01-04
    • 2019-02-14
    相关资源
    最近更新 更多