客户端未使用 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 处理程序未向所有客户端发布消息