2011-10-26 100 views
0

我正在編寫自己的腳本以使用WebSocket API連接到使用JavaScript的websocket服務器。我在連接關閉時遇到了問題。JavaScript WebSocket直接關閉連接

這裏的客戶端腳本:

var host = 'ws://localhost:8080'; 
try 
{ 
    debug.add('Connection request submitted for ' + host); 
    socket = new WebSocket(host); 
    debug.readyStateListener(); 

    debug.add('Socket request started'); 

    socket.onopen = function() 
    { 
     debug.add('Connection opened'); 
    } 

    socket.onmessage = function(message) 
    { 
     debug.add('data received ' + message.data); 
    } 
    socket.onclose = function() 
    { 
     debug.add('Connection closed'); 
    } 
} 
catch(e) 
{ 
    debug.add('WebSockets error ' + e.toString()); 
} 

這是我收到的調試:

Connection request submitted for ws://localhost:8080 
socket readyState change to 0 
Socket request started 
socket readyState change to 3 
Connection closed 

的debug.readyStateListener()投票socket.readyState更改。發生了什麼變化爲0意味着連接正在打開,然後立即變爲3連接已關閉。

服務器收到的連接正常,但連接立即由客戶端關閉。

我已經在Opera 11中啓用了WebSockets並在最新版本的Chrome中試過它。兩次都得到了同樣的結果。

我可以通過一個原始的連接與服務器進行完美的交流,或者簡單地通過在瀏覽器中訪問http://localhost:8080/這就是結果:

GET/HTTP/1.1 
User-Agent: Opera/9.80 (Windows NT 6.1; U; IBM EVV/3.0/EAK01AG9/LE; en) Presto/2.9.168 Version/11.51 
Host: localhost:8080 
Accept: application/xhtml+voice+xml;version=1.2, application/x-xhtml+voice+xml;version=1.2, text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1 
Accept-Language: nl-NL,nl;q=0.9,en;q=0.8 
Accept-Encoding: gzip, deflate 
Connection: Keep-Alive 

的連接也通過HTTP發送請求保持活着沒有任何瑕疵直到我結束它。

通過JavaScript的WebSocket的API去服務器接收到這個請求:

GET/HTTP/1.1 
Host: localhost:8080 
Origin: http://localhost 
Upgrade: WebSocket 
Sec-WebSocket-key1: L58(b Q]'9 4 9\ 0 *+ 6 a4 
Connection: Upgrade 
Sec-WebSocket-Key2: \+ 1 5d/9541840N*4 

我最後的猜測是連接:升級或升級:WebSocket的不被客戶適當的支持。對我來說,接收連接會更合乎邏輯:保持活躍,但我不知道如何重新使用此連接。

+0

替代方法:你看過[socket.io](http://socket.io)? – josh3736

+1

「在最新版本的Chrome中」 - Chrome使用不使用「Sec-WebSocket-key1」和「-key2」的新草稿,而是使用基本64編碼版本。該草案版本是徹底的檢修,並且是最後一個版本。你最好實施那個。這更復雜,但您正在實施的版本已被棄用。無論如何,如果你仍然在使用舊草案 - 你是否正確計算了響應鍵?你可以發佈握手響應密鑰代碼嗎? – pimvdb

回答

0

連接總是會發生,但根據握手過程保留或丟棄。您需要確保您的Chrome版本和WebSocket服務器都實現了相同版本的WebSocket規格草案。

否則,連接最終被拒絕。

+0

任何想法如何改變與node.js網絡一起發送的頭文件?我甚至無法找到發送握手的方式。 – Chris

+0

你在node.js上使用了什麼? socket.io? – Asti