2012-05-04 26 views
6

Tôi có máy khách/máy chủ websocket hoạt động hoàn hảo với Firefox và Chrome 18. Nó không hoạt động với Chrome 19 beta. Tôi nghi ngờ đó là do trình duyệt này hiện đang sử dụng một phần mở rộng khung deflate mà máy chủ của tôi không hỗ trợ.Không thể kết nối websocket hoạt động trong Chrome 19

Chrome 19 beta là gửi này trong cái bắt tay của nó: "Sec-WebSocket-Extensions: x-webkit-deflate-frame"

Tôi có máy chủ của tôi gửi lại: "Sec-WebSocket-Extensions:"

Nhưng đây không phải là cách thích hợp để từ chối tiện ích hoặc có lỗi khác mà tôi không bắt được. Đây là điều duy nhất trong cái bắt tay khác với những gì tôi thấy đến từ các trình duyệt đang hoạt động.

Chỉnh sửa: Dưới đây là một số thông tin bổ sung. Đây là những cái bắt tay được chụp bởi Wireshark.


Các bắt tay sử dụng Firefox 12:

GET/chatserver HTTP/1.1
Host: (bỏ qua cho bài này)
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv : 12.0) Gecko/20100101 Firefox/12.0
Chấp nhận: text/html, application/xhtml + xml, application/xml; q = 0.9, /; q = 0.8
Accept-Language: en-us, en; q = 0.5
Chấp nhận mã hóa: gzip, d eflate
DNT: 1
kết nối: giữ-sống, Nâng cấp
Sec-WebSocket-Version: 13
Xuất xứ: (bỏ qua cho bài này)
Sec-WebSocket-Key: 2TKm4ozUQdNP17Lobt7IBg ==
pragma: không có -cache
Cache-Control: no-cache
nâng cấp: WebSocket

HTTP/1.1 101 Giao thức Switching
nâng cấp: WebSocket
Connecti trên: Nâng cấp
Sec-WebSocket-Accept: pSUB3BT9YUUd9n3mOeWY/1uVqJE =


Các bắt tay sử dụng Chrome 18:

GET/chatserver HTTP/1.1
nâng cấp: WebSocket
kết nối: Nâng cấp
Máy chủ: (bỏ qua cho bài đăng này)
Xuất xứ: (bỏ qua cho bài đăng này)
Sec-WebSocket-Key: zuHLEC8pGvAMadarhCLXFA ==
Sec-WebSocket-Phiên bản: 13

HTTP/1.1 101 Giao thức Switching
nâng cấp: WebSocket
kết nối: Nâng cấp
Sec-WebSocket-Accept: LMBSq6Bk9Kiv + zAbQlAL899pfzc =


Các bắt tay sử dụng Chrome 19:

GET/chatserver HTTP/1.1
Nâng cấp: websocket
Kết nối: Nâng cấp
Máy chủ: (bỏ qua cho bài đăng này)
Xuất xứ: (bỏ qua cho bài này)
Sec-WebSocket-Key: TbwnVcuUiqGgZn7hxvxzvQ ==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: x-webkit-deflate-frame

HTTP/1.1 101 Giao thức chuyển mạch
nâng cấp: WebSocket
kết nối: Nâng cấp
Sec-WebSocket-Accept: D45BJ + Vfydy1Upcs3Hze/nuiaS8 =
Sec-WebSocket-Extensions:


Tất cả các phản hồi của máy chủ đều có dòng kết thúc và bao gồm phần bổ sung \ r \ n ở cuối thư.

FF12 và Chrome18 hoạt động - Chrome19 không hoạt động. Trong Chrome19, gói tiếp theo sau khi phản hồi bắt tay máy chủ là FIN/ACK. Kết nối đã đóng.

nb. Tôi cũng đã thử sử dụng dấu gạch nối làm giá trị Sec-WebSocket-Extensions nhưng không hoạt động.

Trả lời

4

Đã tìm thấy sự cố.

Thứ nhất, mục nhập Sec-WebSocket-Extensions trống trong phản hồi của máy chủ đang tạo ra lỗi "Invalid UTF-8 sequence in header value". Sau khi xóa mục nhập đó, lỗi còn lại là "A server must not mask any frames that it sends to the client."

Thật vậy, việc triển khai máy chủ của tôi (phiên bản được sửa đổi cao của PHPWebSocket) mặc định che giấu khung hình mà nó gửi. Thay đổi hành vi mặc định này đã khắc phục được sự cố và kết nối websocket giờ đây hoạt động trong Chrome 19.

Thêm thẻ PHPWebSocket vào câu hỏi này vì đây là vấn đề với dự án đó.

+0

Hi Aaron, Bạn có thể chỉ cho tôi địa điểm và điều cần thay đổi không? Tôi có cùng một vấn đề, tôi đang sử dụng cùng một PHP-Websocket và nó đột nhiên ngừng hoạt động trên phiên bản Chrome mới nhất. –

+0

@ClintonGreen: Tìm chức năng gửi trong Connection.php. Bạn sẽ thấy trong các đối số mà $ masked mặc định là true. Đối số đó cần phải sai để gửi đi hoạt động chính xác trong Chrome 19+. Xin lỗi vì hồi âm muộn. – Aaron

+0

cảm ơn rất nhiều. Tôi sẽ cho nó đi. Chúc mừng –

0

Đối với Chrome, tiêu đề "Sec-WebSocket-Protocol" phải có giá trị cho cả máy chủ và phía máy khách. Đây là trường hợp của tôi.