首先 sockjs-node 是一个JavaScript库,提供跨浏览器 JavaScript 的 API,创建了一个低延迟、全双工的浏览器和web服务器之间通信通道。
服务端:sockjs-node(https://github.com/sockjs/sockjs-node)
客户端:sockjs-clien(https://github.com/sockjs/sockjs-client)
我今天是在 Linux 下使用 Webstorm 写 Vue 项目遇到的该问题。现在已经找了问题真正的根源(至少是在我的环境是这样的),首先 sockjs-node 确实是维持全双工通信用的,关键在于为什么要有这个东西,其实其作用就是保证我们在改完代码重新编译之后,能够通知浏览器重新加载变更结果(我也是因为之前都可以改完代码之后浏览器可以及时刷新显示效果,但是今天却不能正常工作,其原因就在于该请求一直失败)。
所以剩下的就是排查问题,我看了这个请求的 IP 地址,使用的外部地址(如上图),此时想到因为我打开了 ShadowSockets ,并且排除规则里面只有本地地址,没有外部地址,所以该请求应该是走了代理,而我的外部地址并非公网 IP【10.19.245.12 只是局域网IP 】,所以代理之后的请求一定会得不到响应而失败。为了验证自己的猜测,使用 wireshark 抓包确认一下:
从上图可以看到,确实该请求被本地提供代理服务的 Shadowsocket 代理了。
既然找到原因,那我就将我的外部地址添加到代理忽略列表中就可以解决该问题【PS:由于每个人使用的代理软件可能存在差异,具体如何操作自己根据自己的情况百度即可】。此时该请求就变得正常了,同时浏览器也可以实时更新我的编码改动结果。
学以致用,勤动脑筋,记录此次有意思的折腾。