2012-02-20 27 views
9

Edit: tôi đã cố gắng phpwebsocket này: http://www.wilky.it/Shared/phpwebsocket.zip và nó hoạt động trong Firefox, nhưng câu hỏi của tôi vẫn là: làm thế nào để tôi nhận được WebSockets để làm việc với một máy chủ php trong Chrome 17?'Sec-WebSocket-Accept' tiêu đề là mất tích trong Chrome 17


Tôi đang theo hướng dẫn ở đây: http://net.tutsplus.com/tutorials/javascript-ajax/start-using-html5-websockets-today/

Có vẻ như mặc dù client kết nối, và sau đó ngay lập tức ngắt kết nối. Tôi nhận thấy lỗi này trong bảng điều khiển:

Error during WebSocket handshake: 'Sec-WebSocket-Accept' header is missing

Tôi đang thử trong Chrome 17.0.963.56 trên máy chủ WAMP localhost của tôi với tiện ích mở rộng php_sockets được bật.

Tôi đã đề cập đến một nơi nào đó rằng Chrome đã thay đổi những gì nó được hỗ trợ, nhưng nó không đi sâu vào cách khắc phục. Tôi đã hy vọng một người nào đó có thể bước tôi qua nó. (Tôi là người mới sử dụng websockets).

Server:

{PATH}>php startDaemon.php

2012-02-20 07:02:51 System: Socket Resource id #7 created.

2012-02-20 07:02:51 System: Socket bound to localhost:8000.

2012-02-20 07:02:51 System: Start listening on Socket.

2012-02-20 07:03:01 WebSocket: Resource id #8 CONNECTED!

2012-02-20 07:03:01 WebSocket: Requesting handshake…

2012-02-20 07:03:01 WebSocket: Handshaking…

2012-02-20 07:03:01 WebSocket: Done handshaking…

2012-02-20 07:03:01 WebSocket: Resource id #8 disconnected!

Chủ đầu tư:

Socket Status: 0

Socket Status: 3 (Closed)

+0

Sẽ hữu ích nếu bạn có thể in bắt tay đã nhận và toàn bộ phản hồi được gửi đi. Lỗi chỉ ra rằng giá trị Chấp nhận bị thiếu nhưng thật khó để biết mà không nhìn thấy yêu cầu bắt tay và phản hồi. Tôi lưu ý rằng máy chủ bạn đã liên kết đang gửi lại cho nhiều trường trong phản hồi. – kanaka

+0

Tôi đang sử dụng chính xác mã từ liên kết đó. Tôi không chắc chắn chính xác những gì bạn đang yêu cầu? – allicarn

+0

Tôi yêu cầu bạn thêm công cụ vào mã để in ra yêu cầu bắt tay (từ trình duyệt) và phản hồi (từ máy chủ). – kanaka

Trả lời

1

Tôi có cùng một vấn đề (và tôi dường như không để có thể viết bình luận ở đây, vì vậy tôi gửi bài trả lời).

Thực ra, tôi vừa tải xuống và kiểm tra phpwebsocket.

Trên safari 5.1.4, nó hoạt động tốt.

Mở Chrome 17 tuổi, tôi đã cùng một lỗi trong kịch bản log giao diện điều khiển:

Error during WebSocket handshake: 'Sec-WebSocket-Accept' header is missing 

Vì vậy, trong websocket.class.php, tôi thêm vào header được trả về bởi server:

$accept = base64_encode(SHA1($key."258EAFA5-E914-47DA-95CA-C5AB0DC85B11")); 

Và tôi nhận được lỗi:

Error during WebSocket handshake: Sec-WebSocket-Accept mismatch 

Bây giờ, tiêu đề nhận bởi máy chủ là:

GET /websocket/server.php HTTP/1.1 
Upgrade: websocket 
Connection: Upgrade 
Host: localhost:12345 
Origin: http://localhost:8888 
Sec-WebSocket-Key: OqMJI0t/cOl6d6JNE+Op0g== 
Sec-WebSocket-Version: 13 

Và header gửi trả lại bởi máy chủ là:

HTTP/1.1 101 WebSocket Protocol Handshake 
Upgrade: WebSocket 
Connection: Upgrade 
Sec-WebSocket-Origin: http://localhost:8888 
Sec-WebSocket-Location: ws://localhost:12345/websocket/server.php 
Sec-WebSocket-Accept: ZjY5ODliNTViYzJlOTNkMjk4OTg3Y2U2NjQ3MTBlZjZiNzliYzk4Yg== 

Các Sec-WebSocket-Accept có vẻ tốt, nhưng vẫn còn là một lỗi không phù hợp. Bạn có thấy một sai lầm ở đâu đó không? Có lẽ giao thức đã thay đổi để tính toán Sec-WebSocket-Accept, nhưng tôi không tìm thấy nó ... Cảm ơn sự giúp đỡ của bạn!

Chỉnh sửa: Đây dường như là giải pháp (ít nhất là đối với tôi): thêm thông số đúng với hàm SHA1, như được tìm thấy trong các tệp được đưa ra trong this issue thread. Vì vậy, Sec-WebSocket-Chấp nhận phải được tìm thấy như thế này:

$accept = base64_encode(SHA1($key."258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true)); 

Và, Sec-WebSocket-Key1 và Sec-WebSocket-khóa2 dường như không có mặt nữa trong yêu cầu khách hàng, thay vào đó, $ key phải được trích xuất từ ​​tiêu đề: "Sec-WebSocket-Key".

Sự cố mới: Dường như ngay cả khi kết nối ổ cắm web hiện hoạt động trên bắt tay, nó ngắt kết nối khi tin nhắn đầu tiên được gửi.

0

Tôi nhận thấy rằng trong bảng điều khiển của Chrome 19: Máy chủ không được che bất kỳ khung nào mà nó gửi cho khách hàng. Có thể đây là vấn đề. Nó ngắt kết nối ngay sau khi một tin nhắn được gửi đi. Nó hoạt động tốt trong Firefox.

Tôi đã khắc phục sự cố websocket này và nó hoạt động trong Chrome ngay bây giờ. Trước tiên tôi sử dụng:

Sau đó, tôi đã sử dụng chức năng mã hóa từ: https://github.com/lemmingzshadow/php-websocket

Tôi cố định thay thế chức năng mã hóa với một trong các tập tin connection.php trong github lemmingzshadow và nó bắt đầu làm việc. Hàm này được gọi là: hybi10Encode trong tệp \ server \ lib \ WebSocket \ connection.php.

thay đổi thông số này trong chức năng mã hóa: $ đeo mặt nạ = true vào $ đeo mặt nạ = false

-1

Một cách dễ dàng để sửa chữa được thêm Sec-WebSocket-Accept thông tin khi do_handshake, mã như sau:

list($resource,$host,$origin,$key) = $this->getheaders($buffer); 

    $accept = base64_encode(SHA1($key."258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true)); 

    $upgrade = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" . 
      "Upgrade: WebSocket\r\n" . 
      "Connection: Upgrade\r\n" . 
      "WebSocket-Origin: {$origin}\r\n" . 
      "WebSocket-Location: ws://{$host}{$resource}\r\n". 
      "Sec-WebSocket-Accept: " . $accept . "\r\n\r\n"; 
    $this->handshakes[$socket_index] = true; 

    socket_write($socket,$upgrade,strlen($upgrade)); 

ở đâu,

$accept = base64_encode(SHA1($key."258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true));

$ key là Sec-WebSocket-Key nhận được từ $ đệm, bạn có thể print_r ($ da bò er) để có một cái nhìn.

Hy vọng điều này có thể giải quyết vấn đề của bạn ..

+0

Bạn đang bỏ lỡ một phần tuyệt vời của mã được sửa đổi. – Jeffrey