2013-08-20 81 views
2

我需要在socket.io和websocket(來自'ws'包)處理程序之間共享相同的http服務器。 不幸的是,儘管他們正在監聽不同的前綴,但第一個正在監聽/socket.io,第二個監聽到/ websocket,因爲某些原因,如果它們運行在同一臺服務器上,websocket工作不正常。Socket.io和Webscocket在同一臺服務器上偵聽

我做了一些調試,但似乎這些請求都正確處理這兩個庫,但最終只有socket.io才能正常工作。

任何想法如何解決?

+0

你爲什麼同時使用? – Blender

+0

依賴和客戶類型的複雜性。 – Luman75

回答

1

node.js中的套接字工作方式與普通請求的工作方式有很大不同。沒有路由,所以不要聽一個url,你必須聽所有的套接字。 socket.io的默認行爲是關閉它無法識別的任何套接字連接。爲了解決這個問題,你需要的標誌'destroy upgrade': false添加到選項(server是一個高速服務器):

require('socket.io').listen(server, {'destroy upgrade': false, ...}) 

您還需要在客戶端連接(在代碼中處理/websocket查詢的網址),並忽略它,如果它看起來像它屬於socket.io。您可以從客戶端對象(傳遞到connection處理程序)中找到url作爲client.upgradeReq.url

+0

謝謝,我在一分鐘前就明白了。你整天在哪裏:) – Luman75

+0

@ Luman75今天早上。我只是把一個類似的服務器設置放在一起,所以如果你有更多的問題,請隨時聯繫我。 –

+0

再次感謝,我在一個環境中將sharejs集成到websocket和socket.io客戶端上。我想避免在多個端口上收聽。 – Luman75

0

好的解決方案很簡單(不幸的是半天的調試,現在它很簡單:))。

對於來自非socketio客戶端的升級請求,有一個選項「銷燬升級」。由於Websocket(模塊'ws')使用相同的請求,其中一些可能是'ws'而不是'socket.io'。所以這個選項應該被禁用。

io = require('socket.io').listen(server, { log: false, 'resource':'/socket.io' }); 
io.disable('destroy upgrade') 
0

更新爲2016年

io.disable('destroy upgrade'); 

似乎並沒有被使用了。 但我成功通過WS(使用快遞)的路徑分配的WebSocket模塊:

var wss = new WebSocketServer({ server: server, path: '/ws' }); //do not interfere with socket.io 

當然客戶有相同的路徑WS://theserver.com/ws

我沒得根本改變socket.io的一面。

相關問題