【问题标题】:Decoding network chars (HTML5 Websocket)解码网络字符(HTML5 Websocket)
【发布时间】:2011-12-16 07:12:25
【问题描述】:

我正在尝试使用 HTML5 websocket(使用 hybi-17 协议)开发一个网络聊天,但我在 chars 解码 方面遇到了一些问题。 这是我通过客户端发送的内容(用户代理:Firefox 7):

var socket = new MozWebSocket ('ws://localhost/server.php');
socket.onopen = function () {
  alert ('Opened!');
}

然后,我发送这些数据:

socket.send ('Hello');
socket.send ('World');

这是服务器端代码:

$bytes = @socket_recv ($socket, $buffer, BUFSIZE, 0);

if (($bytes == 0) || ($bytes == 2)) {
  this->disconnect ($socket);
}
else {
  echo $buffer;
}

虽然这是回显收到的数据:

��6S~g?Y (Hello)
���~����� (World)

如您所见,套接字已打开,数据从客户端传输到服务器。 服务器使用 PHP5 并使用普通的套接字函数来建立连接。

如何将不可读的字符串解码为人类可读的字符串?

提前致谢。

【问题讨论】:

    标签: php html websocket


    【解决方案1】:

    你犯了人们第一次开始使用 TCP 编写代码时最常犯的错误之一——你忘记实现协议了!

    在您的情况下,您将其忘记在服务器中。客户端已经有一个 WebSocket 实现,您可以通过创建一个“MozWebSocket”对象来请求它。 WebSocket specification 说:“每一帧都以 0x00 字节开始,以 0xFF 字节结束,中间包含 UTF-8 数据。”服务器中用于查找帧开始和帧结束的代码在哪里?丢弃0xFF字节的代码在哪里?

    您实际上必须实现该协议。协议规范告诉您如何解码接收到的数据。 (在您的情况下,您看到的垃圾数据很可能是协议握手的一部分——在这个description of the handkshake 阶段看起来像^n:ds[4U 的部分。)

    我很确定您调用 PHP 脚本以通过 Web 服务器处理 WebSocket 调用的方法将不起作用。也就是说,除非您的 Web 服务器知道如何执行此操作 -- WaterSpoutphpdaemon 这样做。

    【讨论】:

    • 我刚刚编辑了我的第一个主题并提供了更多详细信息。我认为握手阶段效果很好,我正在寻找一个简单的解决方案。我必须做什么才能解码从客户端发送的数据?如果我对协议有误,我需要做什么样的改变?谢谢。
    • 您实际上必须实现该协议。你可以自己做,也可以给我们existing PHP implementation
    • 不,我不能使用像 phpwebsocket 这样的现有 PHP 实现,因为它与 hybi-17 握手不兼容。事实上,FF 7 和 Chrome 14 都发送一个带有其他不同参数的 Key (Sec-Websocket-Key)。举个例子,在 hybi-17 请求的头部之后:GET server.php HTTP/1.1 Host: localhost:12345 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:7.0.1) Gecko/20100101 Firefox/ 7.0.1 连接:keep-alive,升级 Sec-WebSocket-Version:8 Sec-WebSocket-Origin:localhost Sec-WebSocket-Key:CII8U3hNx3dNF/+GKerVgQ== 升级:websocket 所以,我的问题仍然存在。
    • 我建议找到 WebSocket 协议的现有 PHP 实现并使用它。
    【解决方案2】:

    使用来自http://code.google.com/p/phpwebsocket/ 的基本server.php 和client.html 以及来自HTML5 WebSocket with hybi-17 的修改来处理单键标准,我可以在服务器意外关闭之前成功地向服务器发送一条消息。它至少更近了一步,只是目前还不确定为什么它会在一条成功的消息后关闭。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 2011-02-24
      • 1970-01-01
      • 2021-10-31
      • 1970-01-01
      • 1970-01-01
      • 2016-08-28
      相关资源
      最近更新 更多