가 나는 FF와 크롬 브라우저에서 작동하지만 사파리에하지 않는 스크립트를 실행 할 수 있었다 소스 https://github.com/kallaspriit/PHP-HTML5-WebSocket-ServerPHP의 웹 소켓은, 헤더는
이하로 사용하여 도면과 웹 소켓을 실행 modyfication. 내가 아는 한 이것은 사파리 (FF와 크롬과 다른)에서 사용되는 핸드 셰이크와 관련이있을 수 있습니다. FF에서/
$headers = $this->parseRequestHeader($buffer);
if (isset($headers['Sec-WebSocket-Key'])) {
$key = $headers['Sec-WebSocket-Key'];
} else {
$key = $headers['Sec-WebSocket-Key1'];
}
$hash = base64_encode(
sha1($key . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true)
);
와 헤더 크롬은 초 - 웹 소켓 - 키 존재하며, 사파리는 초 - 웹 소켓 - 키 1 절 및-웹 소켓 - 키 2를/가지고 : 클래스에서
나는 규칙 아래에서 발견 SocketServer.php
if (isset($headers['Sec-WebSocket-Key'])) {
$headers = array(
'HTTP/1.1 101 Switching Protocols',
'Upgrade: websocket',
'Connection: Upgrade',
'Sec-WebSocket-Accept: ' . $hash
);
} else {
$headers = array(
"HTTP/1.1 101 Web Socket Protocol Handshake",
"Upgrade: WebSocket",
"Connection: Upgrade",
"WebSocket-Origin: http://localhost",
"WebSocket-Location: ws://localhost:9300",
);
}
$headers = implode("\r\n", $headers) . "\r\n\r\n";
$left = strlen($headers);
do {
$sent = @socket_send($this->socket, $headers, $left, 0);
if ($sent === false) {
$error = $this->server->getLastError();
throw new Exception(
'Sending handshake failed: : ' . $error->message .
' [' . $error->code . ']'
);
}
$left -= $sent;
if ($sent > 0) {
$headers = substr($headers, $sent);
}
} while ($left > 0);
$this->state = self::STATE_OPEN;
}
나는 아무 효과하지만 사파리 헤드 라인을 변경하려고했다. 사파리는 나와 연결하고 같은 시간에 연결을 끊습니다. 문제는 그 헤드 라인에 기인한다고 생각합니다. 나는 올바른 방법으로 작동하도록 사용자 정의하는 방법을 모르겠습니다. 사파리와 다른 브라우저를 지원하도록 코드를 수정하는 방법에 대해 알고있는 사람이 있습니까?
vesrion에서 토론을 볼 수 있습니다. http://stackoverflow.com/questions/1253683/what-browsers-support-html5-webocket-api here –