解码网络字符(HTML5 Websocket)

时间:2011-10-27 07:18:28

标签: php html5 websocket

我正在尝试使用HTML5 websocket(使用 hybi-17 协议)开发网络聊天,但我在字符解码方面遇到了一些问题。 这是我通过客户端发送的内容(用户代理: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 并使用普通的套接字函数来构建连接。

如何在人类可读的字符串中解码该不可读的字符串?

提前致谢。

2 个答案:

答案 0 :(得分:5)

当你第一次开始编写使用TCP的代码时,你犯了一个最常见的错误 - 你忘了实现协议了!

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

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

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

答案 1 :(得分:0)

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