[英]Socket.io and Webscocket listen on the same server
我需要在socket.io和websocket(來自“ ws”包)處理程序之間共享相同的http服務器。 不幸的是,盡管它們正在偵聽不同的前綴,但是第一個偵聽/socket.io,第二個偵聽/ websocket url,由於某些原因,如果它們在同一服務器上運行,則websocket無法正常工作。
我進行了一些調試,但似乎兩個庫都正確處理了請求,但最終只有socket.io可以正常工作。
知道如何解決嗎?
套接字在node.js中的工作方式與普通請求的工作方式有很大不同。 沒有路由,因此您必須偵聽所有套接字,而不是偵聽url。 socket.io
的默認行為是關閉它無法識別的所有套接字連接。 要解決此問題,您需要在選項中添加'destroy upgrade': false
標志'destroy upgrade': false
( server
是快速服務器):
require('socket.io').listen(server, {'destroy upgrade': false, ...})
您還需要在客戶端連接時檢查url(在代碼處理/websocket
),如果它看起來似乎屬於socket.io
,則將其忽略。 您可以從客戶端對象(傳入到on 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');
似乎不再可用。 但是我通過為websocket模塊ws分配了一條路徑來成功(使用Express):
var wss = new WebSocketServer({ server: server, path: '/ws' }); //do not interfere with socket.io
當然,客戶端具有相同的路徑ws://theserver.com/ws
我根本不需要更改socket.io端。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.