2011-09-09 14 views
6

Tôi hiện đang làm việc với WebSockets và máy chủ PHP: hoạt động rất tốt với Google Chrome và Opera nhưng không hoạt động với Firefox 6.JavaScript và WebSockets: sử dụng giao thức cụ thể

Tôi nghĩ là do phiên bản giao thức này sử dụng cuối cùng: Tôi thấy một nơi nào đó mà nó sử dụng phiên bản thứ bảy, trong khi đó là một phiên bản cũ hơn cho Google Chrome và Opera.

Vì vậy, tôi đổi mã máy chủ của tôi để quản lý phiên bản mới này: bởi băm-key an toàn với 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 và chất liệu khác, Firefox thành công để kết nối. Nhưng nếu một khách hàng khác muốn kết nối (ngay cả một Firefox khác), thì Firefox đầu tiên sẽ kết nối với chính nó.

tôi thấy rằng bộ đệm nhận bởi socket_recv() là một trong hai sản phẩm nào hoặc băm ...

Vì vậy, tôi đã quyết định bỏ qua ý tưởng về quản lý giao thức được sử dụng bởi Firefox 6 (không có tài liệu hướng dẫn trên Internet ... !): Tôi nghĩ rằng có thể dễ dàng xác định giao thức để sử dụng trực tiếp trong JavaScript.

On this page họ nói rằng chúng ta có thể viết này:

var mySocket = new WebSocket("http://www.example.com/socketserver", "my-custom-protocol"); 

Nhưng những gì chúng ta nên viết thay vì "my-tùy chỉnh giao thức" để sử dụng các giao thức của Google Chrome và Opera quản lý?

Cảm ơn trước!

+0

Có phiên bản 'hybi-00' còn được gọi là 'hixie-76' và bao gồm hai khóa nhị phân. Ngoài ra còn có 'hybi-07' mới sử dụng khóa bảo mật mà bạn đã đăng. Bạn sẽ phải tạo một cái bắt tay chính xác tùy thuộc vào phiên bản mà cái bắt tay * yêu cầu * là. Vì cả hai phiên bản đều sử dụng các tên tiêu đề khác nhau cho các khóa, nên có thể. – pimvdb

+0

Cảm ơn câu trả lời của bạn! Vì vậy, tôi đã thử này: 'var mySocket = new WebSocket (" http://www.example.com/socketserver "," hybi-00 ");' nhưng tiêu đề gửi bởi Firefox vẫn như cũ ... Sự khác biệt duy nhất bây giờ là có _Sec-WebSocket-Protocol: hybi-00_ trong tiêu đề, nhưng nó vẫn sử dụng phiên bản thứ bảy. – KorHosik

+0

Tôi nghĩ tôi chưa hoàn toàn rõ ràng. Mỗi trình duyệt gửi một trong hai phiên bản và bạn không thể kiểm soát điều đó. Tuy nhiên, trên máy chủ, bạn có thể kiểm tra phiên bản nào đã được gửi và trả lời thích hợp (tức là phản hồi bắt tay chính xác). – pimvdb

Trả lời

10

Tùy chọn giao thức cho hàm tạo WebSocket thực sự là "giao thức phụ" (thường được gọi bằng tên đó) và nó là một giao thức con cấp ứng dụng. Nó không có bất kỳ ảnh hưởng nào trên phiên bản giao thức WebSocket thực tế. Trình duyệt về cơ bản hỗ trợ một phiên bản duy nhất của giao thức WebSocket. Hầu hết các máy chủ đều hỗ trợ một số phiên bản của giao thức.

Firefox 6.0 đã giới thiệu hỗ trợ cho chuỗi giao thức HyBi mới (HyBi-00 thực sự chỉ là bản sao của giao thức Hixie-76). Các phiên bản HyBi giới thiệu một định dạng khung mới cho dữ liệu và không chỉ là một thay đổi cho cái bắt tay. Chrome 14 cũng sử dụng chuỗi giao thức HyBi mới.

Đây là phiên bản mới nhất của giao thức WebSockets: http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-14 mặc dù firefox 6.0 thực sự là http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-07 nhưng thực sự không có nhiều thay đổi thực (chủ yếu là thay đổi văn bản đối với thông số kỹ thuật).

Bạn có chắc chắn rằng firefox đang kết nối thành công (tức là bạn có thực sự nhận được sự kiện onopen trong trình duyệt) không?

+0

Than phiền cho những giải thích này! Tôi đã thực sự nhận được một sự kiện onopen, đó là lý do tại sao tôi cho rằng vấn đề xuất phát từ cách gửi tin nhắn (và pimvdb đã xác nhận rằng^^). Tôi đã tải xuống và thử nghiệm với Google Chrome 14 và sự cố tương tự đã xảy ra ... Quản lý WebSockets có vẻ khó khăn như vậy, tôi nghĩ tôi sẽ sử dụng Node.js hoặc một số thứ khác ^^ ' – KorHosik

+0

Bạn có thể muốn xem qua tại [Socket.IO] (http://socket.io) là lớp WebSocket chạy trên Node.js và xử lý việc quản lý phiên (và cũng có một dự phòng để thăm dò ý kiến ​​lâu nếu WebSockets không được trình duyệt hỗ trợ). – kanaka

+0

@KorHosik, cũng nếu bạn nghĩ rằng điều này đã trả lời đủ câu hỏi của bạn, đừng quên chọn câu trả lời cho những người theo dõi sau đó (và danh tiếng của khóa học ;-)). – kanaka