簡體   English   中英

Socket.io和Webscocket在同一台服務器上偵聽

[英]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': falseserver是快速服務器):

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM