gpt4 book ai didi

php - socket_recv 未收到完整数据

转载 作者:行者123 更新时间:2023-12-03 01:01:45 25 4
gpt4 key购买 nike

我通过 Websocket 从浏览器发送大约 5000 字节的图像数据,但此行仅接收总共 1394 字节:

while ($bytes = socket_recv($socket, $r_data, 4000, MSG_DONTWAIT)) {
$data .= $r_data;
}

这是在握手完成后正确接收的情况。 json 数据在 1394 字节后被截断。 可能是什么原因?

在浏览器界面中,它以 JSON 形式发送图像:

websocket.send(JSON.stringify(request));

浏览器界面很好,因为它可以与我测试过的其他 PHP websocket 免费程序一起使用。

这是完整的source code .

最佳答案

通过指定 MSG_DONTWAIT 将套接字设置为非阻塞,因此它将在读取第一个数据 block 后返回 EAGAIN,而不是等待更多数据。删除 MSG_DONTWAIT 标志并使用 MSG_WAITALL 代替,以便等待接收所有数据。

有几种方法可以了解您是否已收到所需的所有数据:

  1. 发送数据的长度。如果您想发送多个可变长度内容 block ,这非常有用。例如,如果我想发送三个字符串,我可能首先发送一个“3”来告诉接收者需要多少个字符串,然后对于每个字符串,我将发送字符串的长度,然后是字符串数据。
  2. 使用固定长度的消息。如果您期望多条消息,但每条消息的大小相同,那么您可以从套接字读取,直到至少有那么多字节,然后处理该消息。请注意,您可能会在一次 recv() 调用中收到多条消息(包括部分消息)。
  3. 关闭连接。如果您只发送一条消息,那么您可以半关闭连接。这是可行的,因为 TCP 连接维护着单独的发送和接收状态,因此服务器关闭发送连接,但保留接收连接以等待客户端的回复。在这种情况下,服务器将其所有数据发送到客户端,然后调用 socket_shutdown(1)
如果您想在接收数据的同时处理数据,则 1 和 2 非常有用 - 例如,如果您正在编写游戏、聊天应用程序或套接字保持打开状态并且来回传递多个消息的其他应用程序。 #3 是最简单的一种,当您只想一次性接收所有数据(例如文件下载)时非常有用。

关于php - socket_recv 未收到完整数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31554108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com