我需要在socket.io和websocket(來自'ws'包)處理程序之間共享相同的http服務器。 不幸的是,儘管他們正在監聽不同的前綴,但第一個正在監聽/socket.io,第二個監聽到/ websocket,因爲某些原因,如果它們運行在同一臺服務器上,websocket工作不正常。Socket.io和Webscocket在同一臺服務器上偵聽
我做了一些調試,但似乎這些請求都正確處理這兩個庫,但最終只有socket.io才能正常工作。
任何想法如何解決?
我需要在socket.io和websocket(來自'ws'包)處理程序之間共享相同的http服務器。 不幸的是,儘管他們正在監聽不同的前綴,但第一個正在監聽/socket.io,第二個監聽到/ websocket,因爲某些原因,如果它們運行在同一臺服務器上,websocket工作不正常。Socket.io和Webscocket在同一臺服務器上偵聽
我做了一些調試,但似乎這些請求都正確處理這兩個庫,但最終只有socket.io才能正常工作。
任何想法如何解決?
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
。
好的解決方案很簡單(不幸的是半天的調試,現在它很簡單:))。
對於來自非socketio客戶端的升級請求,有一個選項「銷燬升級」。由於Websocket(模塊'ws')使用相同的請求,其中一些可能是'ws'而不是'socket.io'。所以這個選項應該被禁用。
io = require('socket.io').listen(server, { log: false, 'resource':'/socket.io' });
io.disable('destroy upgrade')
更新爲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的一面。
你爲什麼同時使用? – Blender
依賴和客戶類型的複雜性。 – Luman75