网上给的所有的引入socket.io的方法(包括socket.io官网给的demo)都是<script
src="/socket.io/socket.io.js"></script>
,但是我在自己用express生成的项目中用同样的方法引入失败,
一直是404,该怎么解决?
多方查询无果,但有人提到以下情况:
"其实这个/socket.io/socket.io.js
是socket.io服务器端以HTTP方式提供的静态文件。而在服务器端,socket.io和Express绑定了同样的端口。所以,在静态页面中,可以直接用这个方式来请求服务器上的文件。估计你的Express和socket.io没有监听同一个端口,所以会出现这个问题。
当然,另外的方法是,你直接以HTTP方式请求socket.io服务器所在端口上的文件,如http://localhost:SOCKET_IO_PORT/socket.io/socket.io.js
。"
受此启发,回看官网的demo,其中 有一条语句:server.listen(80);还有一个提示使用:<script src="http://your-io-server/socket.io/socket.io.js">
而之前在浏览器控制台看到的一直是3000端口GET不到/socket.io/socket.io.js文件,所以,就尝试将其改成
<script src="http://127.0.0.1:80/socket.io/socket.io.js">
奇迹出现了。
总结:<script src="http://your-io-server/socket.io/socket.io.js">的your-io-server的端口要和server.listen(***)的端口一致才能GET到。
我的client.js内容如下:
<script src="http://localhost:80/socket.io/socket.io.js"></script> <script> var socket = io.connect('http://localhost'); socket.on('news', function (data) { console.log(data); socket.emit('my other event', { my: 'data' }); }); </script>
补充:一般我们在部署web应用个时候,默认使用的80端口,所以我们可以将socket监听的端口改成其他可供我们使用的端口,比如4000,5000等等。只要前端引入时和后端开放的端口一致即可。