客户端未使用 websockets 接收所有消息

Posted

技术标签:

【中文标题】客户端未使用 websockets 接收所有消息【英文标题】:Client not receiving all messages using websockets 【发布时间】:2010-12-18 16:19:49 【问题描述】:

我在 localhost 上设置了一个 WebSockets 服务器,使用 phpwebsocket。客户端几乎在同一时间向服务器('hi server')发送 2 条消息

socket.send('hi server');
socket.send('hi server');

服务器正在接收消息并回复消息“支持客户端”。

...
case "hi server": $this->send($user->socket,"sup client"); break;
...
function send($client,$msg) 
    echo "> ".$msg;
    $msg = $this->wrap($msg);
    socket_write($client,$msg,strlen($msg));
    echo "! ".strlen($msg)."\n";
 
...
function wrap($msg="") return chr(0).$msg.chr(255); 

php 日志如下所示:

客户端接收消息的代码:

socket.onmessage = function(msg)

    log("Received: " + msg.data);

客户端在 div 元素中实际记录的内容:

我不知道为什么当 websocket 服务器发送 2 时客户端只处理一条消息。我应该在那个 div 标签中有 2 'Received: sup client'。我在想也许它发送消息对于 javascript 或其他东西来说太快了。

【问题讨论】:

为每条消息发送一个唯一标识符。即使是一个简单的全局递增值也可以。这将让您看到哪条消息失败了。如果它始终是同一个,那么您的代码可能有问题。如果它是随机的,则说明某处存在系统错误和/或竞争条件。 谢谢 Marc,我用它最终找到了问题(下面的解决方案)。 phpwebsocket... 【参考方案1】:

在做了一些测试之后,我发现实际上只有第一个响应没有被 websockets 服务器发送。我做了一些谷歌搜索,结果发现phpwebsocket 存在问题 - 握手没有正确完成或其他什么。在this page 上,我找到了如下解决方案:

更改 websocket.class.php 中的第 102 行

From: socket_write($user->socket,$upgrade.chr(0),strlen($upgrade.chr(0)));
To:   socket_write($user->socket,$upgrade.chr(0).chr(255),strlen($upgrade)+2); 

(添加一个不间断的空格)

现在工作正常。 :)

【讨论】:

以上是关于客户端未使用 websockets 接收所有消息的主要内容,如果未能解决你的问题,请参考以下文章

Spring Websocket 处理程序未向所有客户端发布消息

Web Socket 消息未全部接收

WebSocket

Websocket客户端未收到任何消息

如何使用 websocket websocketpp 发送和接收消息?

Spring Websockets:如何验证消息和接收客户端?