2011-08-17 82 views
7

所以Chrome 14已經實現了hybi10版本的websockets。我有一個內部程序,我們公司使用通過鉻,使用websockets這是改變打破。PHP Websocket服務器hybi10

有沒有人成功地使用PHP服務器構建數據?我能夠得到新的握手來工作,但我似乎無法弄清楚框架。這裏有一個python示例https://github.com/kanaka/websockify/blob/master/websocket.py#L233,但我很難將其轉換爲php,任何人都有建議?

我應該提到python例子中的函數decode_hybi()。

+1

也許這個問題對你很有趣:http://stackoverflow.com/questions/7040078/not-sure-how-to-frame-data-in -websockets-草案-08。我試圖解釋新框架是如何工作的;也許它有幫助。 – pimvdb

+0

這是有益的謝謝你!我將在PHP中爲其他人發佈解決方案。 – 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; 
} 

這裏是將數據發送回的代碼。再次,這是非常基本的,它假定你正在發送一個單一的文本框架。沒有連續幀等。沒有錯誤檢查。希望別人覺得它有用。

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