2011-08-17 17 views
7

तो क्रोम 14 ने websockets के hybi10 संस्करण को लागू किया है। मेरे पास एक घर का कार्यक्रम है कि हमारी कंपनी क्रोम के माध्यम से उपयोग करती है जो इस परिवर्तन के साथ टूटने वाले websockets का उपयोग करती है।PHP वेबस्केट सर्वर hybi10

क्या कोई भी php सर्वर का उपयोग कर डेटा तैयार करने में सफल रहा है? मैं काम करने के लिए नया हैंडशेक प्राप्त करने में सक्षम हूं लेकिन मुझे फ़्रेमिंग का पता लगाना प्रतीत नहीं होता है। यहां एक पाइथन उदाहरण है https://github.com/kanaka/websockify/blob/master/websocket.py#L233 लेकिन मुझे इसे php में परिवर्तित करने में मुश्किल हो रही है, किसी के पास कोई सुझाव है?

मुझे यह उल्लेख करना चाहिए कि पायथन उदाहरण पर प्रश्न में कार्य decode_hybi() है।

+1

शायद यह प्रश्न आपके लिए दिलचस्प है: http://stackoverflow.com/questions/7040078/not-sure-how-to-frame-data-in -websockets-ड्राफ्ट-08। मैंने यह बताने की कोशिश की कि नया फ़्रेमिंग कैसे काम करता है; शायद यह मदद करता है। – pimvdb

+0

यह सहायक था धन्यवाद! मैं दूसरों के लिए PHP में समाधान पोस्ट करूंगा। – jivetek

उत्तर

6

मैं अभी पूरा एक वर्ग जो निको कैसर (https://github.com/nicokaiser/php-websocket) hybi-10 फ्रेम और हाथ मिलाना से निपटने में सक्षम की पीएचपी-WebSocket-सर्वर में आता है। आप यहां नई कक्षा डाउनलोड कर सकते हैं: http://lemmingzshadow.net/386/php-websocket-serverclient-nach-draft-hybi-10/ (कनेक्शन.एचपी)

+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; 
} 

यहाँ डेटा वापस भेजने के लिए कोड है। फिर यह बहुत बुनियादी है, यह मानता है कि आप एक पाठ फ्रेम भेज रहे हैं। कोई निरंतरता फ्रेम नहीं। कोई त्रुटि जांच नहीं है। उम्मीद है कि दूसरों को यह उपयोगी लगेगा।

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

संबंधित मुद्दे