socket.io.js 的第 1613 行内容如下:
this.transsports = opts.transsports || ['轮询', 'websocket'];
为什么不是 ['websocket', 'polling'] 的顺序?
在客户端,我正在做:
var socket = io.connect(url);
然后在服务器端,我做了:
io.on('连接', 函数(socket){
控制台日志(套接字);
});
握手部分看起来像:
handshake:
{ headers:
{ 'user-agent': 'node-XMLHttpRequest',
accept: '*/*',
host: 'localhost:8081',
connection: 'close' },
time: 'Fri Sep 11 2015 16:04:39 GMT-0400 (EDT)',
address: '::ffff:127.0.0.1',
xdomain: false,
secure: false,
issued: 1442001879771,
url: '/socket.io/?EIO=3&transport=polling&t=1442001879749-0&b64=1',
query: { EIO: '3', transport: 'polling', t: '1442001879749-0', b64: '1' } }
这是否意味着它使用轮询而不是 websocket?
我尝试将传输明确设置为“websocket”,并且握手部分更改为以下似乎正确的内容:
var socket = io.connect(url,{transsports:['websocket']});
handshake:
{ headers:
{ connection: 'Upgrade',
upgrade: 'websocket',
host: 'localhost:8081',
origin: 'localhost:8081',
'sec-websocket-version': '13',
'sec-websocket-key': 'MTMtMTQ0MjAwMTUxNDcyNA==' },
time: 'Fri Sep 11 2015 15:58:34 GMT-0400 (EDT)',
address: '::ffff:127.0.0.1',
xdomain: true,
secure: false,
issued: 1442001514739,
url: '/socket.io/?EIO=3&transport=websocket',
query: { EIO: '3', transport: 'websocket' } }
+1
我更喜欢“降级”而不是“升级”的想法。目前大多数浏览器都很好地支持websocket。最初连接websocket会提高性能并节省资源。
upgrade
的原因如下。
Socket.IO 从不假设 WebSocket 会正常工作,因为在实践中很有可能不会。 相反,它立即与 XHR 或 JSONP 建立连接,然后尝试将连接升级到 WebSocket。 与依赖超时的回退方法相比,这意味着您的任何用户都不会体验降级。
@nkzawa
我理解为什么首选升级方法,这是一个非常好的功能。
但并不总是需要:在受控企业环境中,降级方法更有意义,我想说强制 Web 套接字作为唯一允许的传输是优化性能的最佳方式。
我试图通过传递这个选项来强制传输到客户端和服务器上的网络套接字:
{ transports: ["websocket"] }
这似乎有效,我只有一个 Web 套接字连接到服务器,但我注意到也在进行轮询,但每次尝试显然都失败了:
Request URL:http://localhost:4000/socket.io/?EIO=3&transport=polling&t=L8RaD0p
{ code: 0, message: "Transport unknown" }
目前是否有任何可行的解决方案可以将这种升级方法更改为降级?
没关系,是我的代码从另一个类中进行了额外的轮询,我也使用了 socket.io。 因此,当我连接时,使用限制传输到 websocket 的 opts 可以满足我的需求。
@sirudog
你可以试试这个:{ transports: ['websocket', 'polling'] }
谢谢@poppowerlb2 (在我的网络标签中没有更多像他这样的流量)。 即使我的浏览器是最新的,我也看到 socket-io-client 更喜欢轮询。
这种升级方法不排除某些服务器吗? 我正在尝试将 socket.io 与节点红色服务器一起使用,但我还无法建立连接。 当然,它适用于普通的 websockets。
我也认为 socket.io 最好尝试 websockets,即使轮询不起作用。
+1
我更喜欢“降级”而不是“升级”的想法。目前大多数浏览器都很好地支持websocket。最初连接websocket会提高性能并节省资源。
`
const client = io('https://io.yourhost.com', { // 警告:在这种情况下,没有回退到长轮询传输:[ 'websocket' ] // 或 [ 'websocket', '轮询'],这是同一件事})
最有用的评论
+1
我更喜欢“降级”而不是“升级”的想法。目前大多数浏览器都很好地支持websocket。最初连接websocket会提高性能并节省资源。