如何在 PHP 服务器上向客户端发送 WebSocket 关闭帧?

Posted

技术标签:

【中文标题】如何在 PHP 服务器上向客户端发送 WebSocket 关闭帧?【英文标题】:How to send a WebSocket close frame to the client on PHP server? 【发布时间】: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 库? 我自己编写库,这就是我遇到这个问题的原因。 【参考方案1】:

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

【讨论】:

以上是关于如何在 PHP 服务器上向客户端发送 WebSocket 关闭帧?的主要内容,如果未能解决你的问题,请参考以下文章

在服务器事件上向客户端发送信息

Socket.io 无法在 Chrome 和 Firefox 上向 Node 服务器发送消息

在 Spring Websocket 上向特定用户发送消息

在 socket.io-client 的客户端上向 self 发送事件

如何在 iOS 设备上向 Web 应用程序发送推送通知?

如何在我的聊天应用程序上向我的其他好友发送文件?