RFC 6455 사양을 지원하는 웹 서버를 찾을 수 없어 PHP로 웹 소켓 서버를 프로그래밍하고 있습니다. 그렇게함으로써 나는 phpwebsocket 코드를 기본으로 사용하여 RFC 6455와 호환되도록 만들었습니다. 적어도 나는 메시지 수신 부분을 위해했다. 내가 서버에 메시지를 다시 보내려고하면 다른 메시지가 나타납니다. 나는 이것이 비트 마스킹에서의 나의 기술 때문에 ... 끔찍한 것이라고 확신한다. 따라서 시행 착오를 거친 후에도 여전히이 문제가 있으며 왜인지 모릅니다.WebSockets RFC 6455 사양 - 데이터 전송 오류
Time OpCode Mask Length Data
1>2012-06-25T18:05:58.014Z 1 true 4 Ping
2>2012-06-25T18:06:02.121Z 1 true 5 hello
3 2012-06-25T18:06:02.121Z A server must not mask any frames that it sends to the server.
또는
3 2012-06-25T18:06:02.121Z Unexpected continuation frame.
내가 명령 줄 인터페이스를 사용하여 내 컴퓨터에 PHP 5.4.4을 사용하고 있습니다. 웹 소켓 서버를 시작하려면 php ws.php
만 있으면됩니다. 그런 다음 wsClient.html
을 내 고객으로 사용합니다. Windows 8 Preview에서 최신 버전의 Google 크롬 (21.0.1180.4 dev-m)을 사용하면 다음 메시지가 표시됩니다.
내 github repo에서 PHP 서버 및 클라이언트를 다운로드하고 거기에서 오래 재생할 수 있습니다. 문제는 WebSockets::send 함수에 있습니다.
private function send($client, $payload)
{
$frame = pack('C2a*', 0b10000001, 0b01111111 & strlen($payload), $payload);
socket_write($client, $frame, strlen($frame));
}
내가 뭘 잘못하고 있니?
아니, 그 점에서 내 코드가 작동합니다. 확인하기 위해 스타일을 변경했지만 팩 형식에 대한 짧은 구문은 완벽하게 유효합니다. 또한 125자를 초과하는 메시지를 보낼 수 없다는 것을 알고 있습니다. 처음에는 메시지를 보내려고합니다. –
"예기치 않은 연속 프레임"이 표시됩니다. 와이어상의 비트가 잘못되었음을 의미합니다. 가장 좋은 이론은 pack() 호출이 예상되는 동작을 제공하지 않는다는 것입니다. 아마 당신은 wireshark (또는 tcpdump)를 작동 시켜서 실제로 어떤 것이 있는지 알아봐야합니다. – kanaka
나는 실제로 그 문제가 무엇인지 알아 냈다. 그리고 나는 –