2010-11-17 175 views
4

我試圖寫一段代碼來打開網絡套接字。無法打開網絡套接字

var ws = null; 


var close = function() { 
if (ws) { 
    console.log('closing ...'); 
    ws.close(); 
} 
} 

var onOpen = function() { 
console.log('opening...'); 
ws.send('hello. im connected'); 
}; 

var onClose = function() { 
    console.log('closed'); 
}; 

var onMessage = function(event) { 
var data = event.data; 
console.log('message: ' + data); 
}; 

close(); 

var url = 'ws://localhost:9999'; 
ws = new WebSocket(url); 
ws.onopen = onOpen; 
ws.onclose = onClose; 
ws.onmessage = onMessage; 

console.log('ws: ' + ws); 


if (ws) 
{ 
console.log('url:' + ws.url); 
console.log('readyState:' + ws.readyState); 
ws.send(msg); 
} 
else 
alert('no ws'); 

但看到控制檯時,readyState的是不斷被「連接」,這將導致插座的send()命令拋出異常。

我試着擴展https://chrome.google.com/extensions/detail/pfdhoblngboilpfeibdedpjgfnlcodoo並得到同樣的問題。服務器非常簡單,接受傳入的套接字並寫出到控制檯。

有最初的手在抖,但客戶的readyState仍然保持爲0。

下面是手抖:

GET/HTTP/1.1 
Upgrade: WebSocket 
Connection: Upgrade 
Host: localhost:9999 
Origin: http://localhost:8080 
Sec-WebSocket-Key1: Qb 15 05 6 Gq 9 26 u0 6 
Sec-WebSocket-Key2: 8096 C0587|7. 

我是否有特定的服務器中的任何東西,讓客戶打開?

謝謝你們。

+0

您是否解析服務器端的握手並從兩個密鑰中發回哈希? – 2010-11-17 10:10:05

+0

你覺得你的問題已經得到了充分的回答嗎? (如果是的話,你可以選擇一個答案)。如果沒有,我們可以幫助您解決您的問題嗎? – kanaka 2010-11-22 15:51:26

回答

1

顯示握手的塊不完整。應該有一個空行,然後是8個字節的額外數據(或key3)。

服務器需要構建一個返回握手,這將是這個樣子:

HTTP/1.1 101 Web Socket Protocol Handshake\r 
Upgrade: WebSocket\r 
Connection: Upgrade\r 
Sec-WebSocket-Origin: http://localhost:8080\r 
Sec-WebSocket-Location: ws://localhost:9999/\r 
Sec-WebSocket-Protocol: sample\r 
\r 
[16 byte md5 hash] 

的16字節哈希服務器返回的計算如下:

  • 取數從key1數據並將它們轉換爲數字。將此數字除以key1數據的空格數。這給你一個4字節的key1號碼。

  • 對key2數據做同樣的事情來獲得key2數字。

  • 通過在key1編號(4字節)後跟隨key2編號(4字節),然後是從客戶端接收的8字節額外數據(8字節)創建一個16字節數組。

  • md5總和16字節數組得到一個新的16字節數組。這是寫到客戶端完成握手響應的內容。

直到服務器返回握手客戶端將顯示「連接」。

服務器握手響應更詳細的基礎上的第二個問題的WebSockets version 76 standards document

更新的5.2節(在答題部分):

如果你正在嘗試做的是送來自擴展的數據,那麼你可能會考慮使用XMLHttpRequest(AJAX)POST請求。既然你從請求中得到任何東西,我懷疑延遲對你的應用程序來說並不重要。 XMLHttpRequest應該很容易支持Firefox和Chrome的擴展。另一方面,如果等待時間很重要,或者如果您的服務器發送的數據純粹是一個套接字服務器,那麼添加WebSockets支持不會比添加HTTP支持困難得多(實際上,可能是更輕鬆)。並且WebSockets支持也應該支持Chrome和Firefox(4.0及更高版本)的擴展。

0

謝謝。

我不知道這是2種方式的溝通。

我編寫了一個Chrome擴展,它打開一個套接字並將數據發送到特定的應用程序。我做了FF的工作,使用下面的插座:

var transportService = Components.classes["@mozilla.org/network/socket-transport-service;1"].getService(Components.interfaces.nsISocketTransportService); 
var transport = transportService.createTransport(null,0,"localhost",9999,null); 

有沒有一種方式,在Chrome上使用類似的方法?或者我必須使用2種方式通信的WebSocket?我不想讓它變得複雜,因爲我必須修改接收器應用程序以返回握手。

謝謝。