2011-08-17 11 views
7

だから、クロム14は、WebSocketをのバージョンをhybi10実装しました。私はこの変更で壊れたウェブソケットを使用するクロムを介して当社が使用する社内プログラムを持っています。PHPのWebSocketサーバーhybi10

は誰でもPHPサーバーを使用してデータをフレーミング成功していますか?私は新しい握手を働かせることができますが、私は額装を理解できないようです。そこここにPythonの例https://github.com/kanaka/websockify/blob/master/websocket.py#L233はあるが、私は誰もが提案を持って、PHPにこれを変換する困難な時間を持つのでしょうか?

I)は、(Pythonの例上の問題の機能がdecode_hybiであることを言及する必要があります。

+1

多分この質問はあなたのために興味深いです:http://stackoverflow.com/questions/7040078/not-sure-how-to-frame-data-in -websockets-draft-08。新しいフレーミングがどのように機能するのか説明しようとしました。おそらくそれは役に立ちます。 – pimvdb

+0

ありがとうございました!私は他の人のためにPHPで解決策を投稿します。 – jivetek

答えて

6

私はちょうどクラスウィッヒはhybi-10フレームと握手を扱うことができるニコカイザー(https://github.com/nicokaiser/php-websocket)のPHP-のWebSocket-サーバーを行い完成。新しいクラスをここからダウンロードできます:http://lemmingzshadow.net/386/php-websocket-serverclient-nach-draft-hybi-10/(Connection.php)

+0

ありがとうございます。私はもともとこの実装を使っていました。あなたは間違いなく私のコードを改善し、完全なソリューションを実装する時間を節約しました! – jivetek

3

は、このコードは、エラーや不正なフレームを負うものではありませんし、この回答に基づいている - How to (de)construct data frames in WebSockets hybi 08+?

は、このコードは非常に基本的で、完全なソリューションにはほど遠いです。それは私の目的のために働く(かなり基本的です)。うまくいけば、それは他人に役立つことでしょう。

function handle_data($data){ 
    $bytes = $data; 
    $data_length = ""; 
    $mask = ""; 
    $coded_data = "" ; 
    $decoded_data = "";   
    $data_length = $bytes[1] & 127; 
    if($data_length === 126){ 
     $mask = substr($bytes, 4, 8); 
     $coded_data = substr($bytes, 8); 
    }else if($data_length === 127){ 
     $mask = substr($bytes, 10, 14); 
     $coded_data = substr($bytes, 14); 
    }else{ 
     $mask = substr($bytes, 2, 6); 
     $coded_data = substr($bytes, 6); 
    } 
    for($i=0;$i<strlen($coded_data);$i++){ 
     $decoded_data .= $coded_data[$i]^$mask[$i%4]; 
    } 
    $this->log("Server Received->".$decoded_data); 
    return true; 
} 

ここに戻ってデータを送信するためのコードです。ここでもこれは基本的なもので、1つのテキストフレームを送信していることを前提としています。継続フレームはありません。エラーチェックもありません。うまくいけば、他の人がそれが役に立つと思うでしょ

public function send($data) 
{ 
    $frame = Array(); 
    $encoded = ""; 
    $frame[0] = 0x81; 
    $data_length = strlen($data); 

    if($data_length <= 125){ 
     $frame[1] = $data_length;  
    }else{ 
     $frame[1] = 126; 
     $frame[2] = $data_length >> 8; 
     $frame[3] = $data_length & 0xFF; 
    } 

    for($i=0;$i<sizeof($frame);$i++){ 
     $encoded .= chr($frame[$i]); 
    } 

    $encoded .= $data; 
    write_to_socket($this->socket, $encoded); 
    return true;  
} 
+1

あなたはそれがうまくいくように管理しました。サーバーからクライアントにデータをエンコードするかどうかを選択できます。それにもかかわらず、 '1000 0001'で始まり、' 0'で始まる別のバイト(マスクしない場合)と長さに同じフォーマットを使用する必要があります(これは必須です;マスキングはスペック)。 – pimvdb

+1

あなたの助けにもう一度大変感謝します!私はこの部分がうまく機能するように管理しました。下のコードをもう一度コピーして、他の人が使用できるようにします。 – jivetek

+0

ソリューションを投稿していただきありがとうございます。それは確かに他の人にとって有益です! – pimvdb

関連する問題