【问题标题】:How do I handle a WebSocket close from the client in Yaws?如何在 Yaws 中处理来自客户端的 WebSocket 关闭?
【发布时间】:2012-03-02 15:03:36
【问题描述】:

我已经实现了一个简单的 appmod 来处理 WebSocket 并回显消息。但是如何处理来自 JavaScript 客户端的ws.close();?我尝试过使用下面的代码,但从未调用过 handle_message({close, Reason}) 并且从未在 JavaScript 客户端上执行过 ws.onclose = function(evt) {}

当我使用相同的 JavaScript 客户端代码与 node.js websocket 交互时,客户端在ws.close(); 之后立即收到onclose 事件。

这是我的简单appmod的代码:

-module(mywebsocket).
-export([handle_message/1]).

handle_message({text, Message}) ->
    {reply, {text, <<Message/binary>>}};

handle_message({close, Reason}) ->
    io:format("User closed websocket.~n", []),
    {close, normal}.

【问题讨论】:

    标签: erlang websocket yaws


    【解决方案1】:

    更新答案:

    从 github 提交 16834c(最终将成为 Yaws 1.93 的一部分)开始,当客户端发送 close 消息时,Yaws 将新的回调传递给您的 WebSockets 回调模块。回调是:

    {close, Status, Reason}
    

    其中Status 是客户端发送的关闭状态,或者如果客户端不包含状态值,则为数值 1000(由 RFC 6455 指定为正常关闭)。 Reason 是一个二进制文件,包含从客户端传递的任何可选原因字符串;如果客户端没有发送原因,它将是一个空二进制文件。

    close 消息的回调处理程序必须返回 {close, CloseReason},其中 CloseReason 是原子 normal 用于正常关闭(导致状态代码 1000 返回给客户端)或另一个合法数字RFC 6455 允许的状态代码。请注意,CloseReason 与客户端传递的任何 Reason 值无关。从技术上讲,CloseReason 也可以是任何其他 Erlang 术语,在这种情况下,Yaws 返回状态 1000 并将该术语传递给 erlang:exit/1 以退出处理 Web 套接字的 Erlang 进程,但基于 RFC 6455,我们建议简单地返回原子 @987654334 @ 代表CloseReason 在所有情况下。

    原始答案,已被 Yaws github commit 16834c 废弃:

    Yaws 从不将{close, Reason} 消息传递给您的回调模块。相反,{close, Reason} 是来自handle_message/1 的有效返回值,如果您的回调模块决定它想要关闭 ws 套接字。

    我修改了 Yaws(1.92 版)附带的 websockets_example.yaws 文件,如果用户在网页上输入“再见”消息,则在客户端调用 this._ws.close(),并向 _onclose 函数添加警报以表明触发了onclose 事件。在这种情况下发生警报,​​我相信是因为“再见”消息导致服务器显式关闭 ws 套接字。但是我随后修改了示例以在客户端中调用this._ws.close(),无论用户输入什么消息,在这种情况下,不会出现onclose 的警报。在这种情况下,检查lsof 显示从浏览器到 Yaws 的 ws 连接仍然存在。

    所以,现在我相信您遇到了一个错误,即 Yaws websockets 支持没有检测到客户端关闭并关闭其结束。我看看能不能解决。

    【讨论】:

    • 谢谢,这提供了丰富的信息。我使用我在How to handle WebSocket messages in an appmod using Yaws? 上发布的客户端代码,其中有一个“断开连接”按钮。
    • 使用 Chrome 17.0.963.46 在调用 ws.close() 时,我没有看到任何从浏览器到 Yaws 的 close 消息。我还尝试了 Chrome 的 16 版,但也没有看到它。你用的是什么浏览器?
    • 我使用 Chrome 16。相同的客户端代码与 node.js 服务器一起使用。
    • 请忽略我之前的评论,缺少close 消息只是我的操作错误。
    • 我已经确认这是 Yaws 中的一个错误。修复。
    猜你喜欢
    • 2017-11-06
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 2011-11-01
    • 2012-03-20
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多