Tôi đang cố gắng sử dụng websockets trên một trang web, vì vậy trước tiên tôi đã phát triển một trang web nhỏ và rất đơn giản chỉ để kiểm tra nó.Ổ cắm trên web Chrome, luôn luôn đọc trên 0
Tôi có một máy chủ websocket chạy trên máy chủ cục bộ của mình, nó dựa trên bản demo Tornado "Trò chuyện" trăn. Đối với một số lý do các ứng dụng demo trò chuyện chạy hoàn hảo nhưng tôi dường như không thể sử dụng websocket với trang của riêng tôi mặc dù một số hình thức kết nối được thực hiện.
Tôi đang thử nghiệm điều này bằng phiên bản Chromium mới nhất, do đó, triển khai websockets phiên bản 13, được hỗ trợ bởi việc triển khai Tornado.
Vì vậy, đây là vấn đề:
- trang Load, js thực thi và nâng cấp yêu cầu được gửi đến máy chủ
- Server nhận được yêu cầu và trả lời
Vì vậy, đây trong sự hiểu biết của tôi Chrome nên thiết lập readyState = 1 và tôi có thể gửi tin nhắn từ trang của tôi.
Chỉ vì một lý do nào đó nó không hoạt động, readyState vẫn là 0 và tất nhiên nếu tôi cố gửi tin nhắn tôi nhận được INVALID_STATE_ERR.
Sau đây là các Headers:
Yêu cầu:
GET ws://127.0.0.1:8000/chatsocket HTTP/1.1
Origin: http://127.0.0.1
Cookie: _xsrf=9f73731fc2d544df864ce777bef0775a
Connection: Upgrade
Host: 127.0.0.1:8000
Sec-WebSocket-Key: pkwlpY+TtxfgUrm3M4WtTQ==
Upgrade: websocket
Sec-WebSocket-Version: 13
đáp ứng:
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: ur9KL2jBhYB38e2SgwOkjyBlQXk=
Any help is appreciated :)
--- EDIT ---
Vì vậy, tôi figured it out cuối cùng, nếu bạn chạy vào cùng một vấn đề ở đây là lý do: readyState
WebSocket được cập nhật khi Chủ đề ENDS!
Vì vậy, chạy một mã như:
var ws = new WebSocket(stuff);
while(ws.readyState==0){};
sẽ gửi cho trình duyệt trong một vòng lặp vô hạn ...
Chạy mã như:
var ws=new WebSocket(stuff);
do_other_stuf();
Có thể làm việc, nhưng bạn sẽ không có thể sử dụng WS.
Nếu mã đó là nghĩa vụ để chạy sau khi ổ cắm mở sử dụng các ổ cắm này là cách nó sẽ phải được viết:
var ws=new WebSocket(stuff);
ws.onopen = new function(){
// some code that need WS to be open
}
// rest of the code that doesn't require WS to be open
Một cách tốt hơn để làm điều này sẽ để cho chủ đề kết thúc bằng cách sử dụng cuộc gọi không đồng bộ:
var ws = new WebSocket(stuff);
setTimeout(whatever,500);
function whatever(){
if(ws.readyState==1){
// The code you want to run after WS is open
}
else
setTimeout(whatever,500);
}
Vui lòng không sử dụng readyState làm chỉ báo để kiểm tra trạng thái kết nối WebSocket. Chỉ sử dụng 'onopen'. – moka