【问题标题】:How to send a WebSocket close frame to the client on PHP server?如何在 PHP 服务器上向客户端发送 WebSocket 关闭帧?
【发布时间】:2016-10-11 13:37:04
【问题描述】:

我在 WebSocekt 类的 close 方法中编写了这段代码:

$msg = str_split(sprintf('%016b', $code), 8);
$msg[0] = chr(bindec($msg[0]));
$msg[1] = chr(bindec($msg[1]));
$msg = implode('', $msg).$reason;
socket_write($client, self::encode($msg, 'close'), 127);

我现在可以确定的是,我已经按照协议页面上告诉我的内容编写了它,方法 encode() 已经创建了一个关闭帧,socket_write() 没有错误地将它发送给客户端,也没有服务器和客户端报告任何错误。但是客户端什么也没收到,当使用console.log()记录onclose事件时,它报告关闭不干净,并得到一个关闭代码1006,没有原因,即使我发送了代码1000的关闭帧和一个正常关闭的原因.所以我很困惑,谁能告诉我如何发送一个关闭帧来完成这项工作。

【问题讨论】:

  • 你使用的是什么 WebSocket 库?
  • 我自己编写库,这就是我遇到这个问题的原因。

标签: php websocket


【解决方案1】:

我也有同样的问题。发送 socket.close(1000, 'Your reason') 不会使客户端收到关闭控制帧。您还必须使用 socket_close($client) 在后端执行此操作。尽管如此,尽管这会关闭连接,但它不会向客户端发送关闭控制帧。我怀疑这与确保 socket_close($client) 等待有关,然后在适当的时候做一些事情。因此,带有 SO_LINGER 的 socket_set_options() 可能会起作用。我仍在调查这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-08
    • 2022-07-15
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多