2013-03-21 37 views
7

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 đề:

  1. trang Load, js thực thi và nâng cấp yêu cầu được gửi đến máy chủ
  2. 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); 
} 
+0

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

Trả lời

3

Để kích hoạt một số chức năng khi WebSockets được kết nối, vui lòng sử dụng gọi lại:

var socket = new WebSocket(...); 

socket.onopen = function() { 
    // socket is connected 
}; 
socket.onerror = function() { 
    // some error happened 
}; 
socket.onmessage = function(evt) { 
    // you get a message: evt.data 
}; 

Sử dụng readyState cũng là điều xấu trong trường hợp này, đặc biệt nếu bạn phải hỏi nhiều lần (chỉ là không cần thiết).

Ngoài ra, hãy lưu ý rằng mỗi nhà cung cấp trình duyệt thực hiện WebSockets với sự khác biệt rất nhỏ (không may), vì vậy hãy đảm bảo bạn thử nghiệm nó trong hầu hết các trình duyệt.

+1

+1 Xóa câu trả lời và tôi sẽ sử dụng nó. – javadba

Các vấn đề liên quan