2012-12-11 7 views
1

가 나는 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; 

}

나는 아무 효과하지만 사파리 헤드 라인을 변경하려고했다. 사파리는 나와 연결하고 같은 시간에 연결을 끊습니다. 문제는 그 헤드 라인에 기인한다고 생각합니다. 나는 올바른 방법으로 작동하도록 사용자 정의하는 방법을 모르겠습니다. 사파리와 다른 브라우저를 지원하도록 코드를 수정하는 방법에 대해 알고있는 사람이 있습니까?

+0

vesrion에서 토론을 볼 수 있습니다. http://stackoverflow.com/questions/1253683/what-browsers-support-html5-webocket-api here –

답변

0

WebSocket 서버가 9 개월 만에 업데이트되지 않은 것 같습니다. 그래서, 적극적으로 개발되고있는 Ratchet과 같은 대체 PHP WebSocket 솔루션을 살펴볼 것을 권한다.