2012-11-21 85 views
0

我有同樣的機器(即同一IP)在兩個不同的瀏覽器(Chrome和Safari),並想知道是否可以將它們連接到同一臺服務器都使用的WebSocket?同一臺計算機上的兩個不同瀏覽器是否可以使用websocket連接到服務器?

我試過。 Chrome瀏覽器連接正常,但Safari瀏覽器將引發一個錯誤,抱怨:

Error during WebSocket handshake: location mismatch: 
wss://www.mysite.com/sockjs/310/s1a5r_6q/websocket != ws://www.mysite.com/sockjs/310/s1a5r_6q/websocket 
sockjs-0.3.js:282Closed transport: websocket SimpleEvent(type=close, code=1006, reason=WebSocket connection broken, wasClean=false) 

但我不知道這是由於每個IP地址一個WebSocket連接的一些限制?

回答

4

MLister,你似乎遇到sockjs部署問題。確保sockjs服務器在通過https的websocket握手期間返回wss://。這是一些sockjs服務器的一個衆所周知的問題 - 服務器並不總是知道頁面通過https服務,並在握手期間返回ws://。

例如,sockjs節點將王菲,WebSocket的節點代碼來處理這種情況是在這裏: https://github.com/faye/faye-websocket-node/blob/master/lib/faye/websocket.js#L40 https://github.com/faye/faye-websocket-node/blob/master/lib/faye/websocket.js#L25-L32

基本上,你必須確保你的負載均衡組「X-轉發,原」頭。

是否有意義?

+0

雖然我理解'x-forwarded-proto'部分,返回(request.connection && request.connection.authorized!== undefined)背後的邏輯是什麼? (request.socket && request.socket.secure);',當x-forwarded-proto'頭沒有設置? – MLister

+1

當'X轉發,proto'頭沒有設置,王菲做最好的,如果連接來通過SSL檢測 - 但它只能猜測。此外,它只有在您的SSL終止由node.js(而不是haproxy,stunnel等)內部完成時才能檢測到它。 – Marek

1

當然這是可能的,至少如果瀏覽器支持網頁套接字API。 你甚至不需要2個不同的瀏覽器,你可以在多個標籤中打開你的網站,例如在Chrome瀏覽器中,它應該可以正常工作。

2

有儘可能的WebSocket協議那張沒有技術限制,雖然有在規範中規定的速率限制每個IP地址的優秀連接防堵垃圾郵件。只有兩個,我懷疑你遇到了這個問題。你的websocket服務器可能有其他策略可以進一步限制這一點。

2

WSS://www.mysite.com/sockjs/310/s1a5r_6q/websocket = WS://www.mysite.com/sockjs/310/s1a5r_6q/websocket

這表明WebSocket連接通過不理解WebSocket連接代理去了。最有可能的是,它是服務器端的反向代理,從代理服務器後面的服務器卸載SSL開銷。代理提供了與客戶端的安全連接,但是報告了從服務器到客戶端的連接的不安全性。這是不正確的。

相關問題