Socket.io http:// localhost:3000 / socket.io / socket.io.js 404(Not Found) - 如何配置socket.IO - nodejs,apache2,websockets?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (861)

好吧,我再次遇到socket.io和express问题。当我运行我的节点js应用程序时,它开始构建之前发生错误“GET http:// localhost:3000 / socket.io / socket.io.js 404(Not Found)”和“Uncaught ReferenceError:io is not defined”这是我第二次使用网络套接字并收到相同的错误。对于之前的应用程序,我通过在我的apache服务器上设置了一个反向代理来解决这个问题。它看起来像这样;

ProxyPass /socket.io http://localhost:3000/socket.io

但是对于当前的nodejs应用程序,这并没有解决问题。这两个应用程序之间的主要区别是,当前应用程序不会开始使用socket.io,直到用户将自己引导到localhost:3000 / bomber-kids-online游戏页面。目前的应用程序是第一个应用程序的扩展,也就是这个nodejs应用程序提供了一个网站,以及我以前的应用程序,这是一个在zEyeland.com/bomber-kids-online上托管的游戏。

这是看我的js文件,它发送浏览器正确的html文件加载:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var express = require('express');
var router = express.Router();

var updatedMAP;
var updatedOBJECTS;

router.get('/', function(req, res){
  res.sendFile(__dirname + '/index.html');
});

io.on('connection', function(socket){
  console.log("a user connected");

  socket.on('sendNoramlBomb', function(xPosition, yPosition, power){

  socket.broadcast.emit('sendNoramlBomb', xPosition, yPosition, 
power);
  });
  socket.on('sendRedBomb', function(xPosition, yPosition, power){

    socket.broadcast.emit('sendRedBomb', xPosition, yPosition, power);
});
  socket.on('sendBlueBomb', function(xPosition, yPosition, power){

    socket.broadcast.emit('sendBlueBomb', xPosition, yPosition, 
power);
  });
  socket.on('sendGreyBomb', function(xPosition, yPosition, power){

    socket.broadcast.emit('sendGreyBomb', xPosition, yPosition, 
power);
  });
  socket.on('sendGreenBomb', function(xPosition, yPosition, power){

    socket.broadcast.emit('sendGreenBomb', xPosition, yPosition, 
power);
  });

  socket.on('sendPlayer', function(locationY, locationX, direction){


    io.emit('sendPlayer',locationY, locationX, direction);
  });

  socket.on('chat message', function(msg){
   io.emit('chat message', msg);
 });

 socket.on('disconnect', function(){
   console.log("user disconnected");
     });
   });

//http.listen(3000, function(){
// console.log('listening on *:3000');
//});

module.exports = router;

这是我当前项目的apache配置

    ProxyPass        /socket.io http://localhost:3000/bomber-kids-online/socket.io
    ProxyPassReverse /socket.io http://localhost:3000/bomber-kids-online/socket.io


    <Proxy *>
        Order deny,allow
    Allow from all 
    </Proxy>    
ProxyRequests Off
ProxyPreserveHost On

ProxyPass    / http://localhost:3000/
ProxyPassReverse / http://localhost:3000/

所以要回顾一下发生了什么。我试图运行一个使用websockets的nodejs游戏。在localhost:3000 / bomber-kids-online上访问我的网站游戏时,它会得到一个(GET http:// localhost:3000 / socket.io / socket.io.js 404(Not Found))如何解决此问题?我的反向代理似乎不能解决这个问题。你可以在zeyeland.com/bomber-kids-online上查看我的游戏的工作版本。我目前的项目使用完全相同的HTML和JavaScript文件来运行。然而,通过检查我上面的reverseProxy,你会注意到,在我当前的项目中,游戏不是直接从localhost:3000访问,而是从另一个服务器上的js文件提供的路径。

这里是我的应用程序的第一个js文件的样子;

 var createError = require('http-errors');
 var express = require('express');
 var path = require('path');
 var cookieParser = require('cookie-parser');
 var logger = require('morgan');

 var indexRouter = require('./routes/index');
 var usersRouter = require('./routes/users');
 var bomberKidsRouter = require('./routes/games/bomber-kids-online- 
game');

 var app = express();

 // view engine setup
 app.set('views', path.join(__dirname, 'views'));
 app.set('view engine', 'pug');

 app.use(logger('dev'));
 app.use(express.json());
 app.use(express.urlencoded({ extended: false }));
 app.use(cookieParser());
 app.use(express.static(path.join(__dirname, 'public')));

 app.use('/', indexRouter);
 app.use('/users', usersRouter);
 app.use('/bomber-kids-online', bomberKidsRouter);

 // catch 404 and forward to error handler
 app.use(function(req, res, next) {
 next(createError(404));
 });

 // error handler
 app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
 res.locals.error = req.app.get('env') === 'development' ? err : {};

 // render the error page
 res.status(err.status || 500);
res.render('error');
 });

 module.exports = app;
提问于
用户回答回答于

问题在于expresssocket.io没有共享相同的服务器。我没有看到任何,server.listen所以我会猜测,socket.io甚至没有听任何港口。

你得到这个错误,因为http://localhost:3000/socket.io/socket.io.js正在服务express,当然你没有这个路由设置(你不应该这样做)。

解决方法是将快速服务器连接到 socket.io

index.js

const app = express();

const server = require('http').Server(app);
const io = require('socket.io')(server); // Pass server to it instead of port

// Now you can pass `io` to any file you want, and setup your socket logic
// Do the same for express app.
// Or handle the logic here, whatever you prefer

server.listen(3000); // Listen

你可以做到这一点,或使用不同的端口socket.io

你能否进一步解释或指向我关于socket.io如何工作的文档,为什么它无法在我的节点应用程序的相同端口上运行

你无需应用程序或服务器在同一端口上侦听,否则你将获得: Error: listen EADDRINUSE

这就是为什么如果你想在同一个端口上使用express和socket.io,你必须使用监听特定端口的服务器。

热门问答

如何设置物联网通信的规则引擎转发到微信小程序?

DylanRichard

腾讯 · 产品经理 (已认证)

万物互联的时代,欢迎来到IoT的世界
推荐

正如参考文章所述,通过规则引擎述是将设备上行数据转发到服务端而不是直接到小程序,需要开发者基于API SDK用于服务端开发,并于小程序进行上下行通信。

在房间内切出app/闪退后还继续收费吗?

腾讯音视频小蔡

深圳市腾讯科技 · 软件开发工程师 (已认证)

QQ:471381568
推荐
1、切出app调用pause的时候是在房间的话,会一直收费。 2、比如A在程序闪退后,如果没有重连,90秒后A会自动退出房间。 3、扣费有疑问可以先看下运营指引:https://cloud.tencent.com/document/product/607/17448 如果对扣费还...... 展开详请

腾讯IM web端sdk 1.7版本,更新到当前最新,在哪里可以查看有什么改动呢?

使用微信小程序也可以做腾讯云的标准视频直播吗?使用微信小程序做腾讯云的视频直播和im即时通讯可行吗?

美女视频一起走向共同富裕
推荐
支持的 IM部分,集成云通信 https://cloud.tencent.com/document/product/269/36838 标准直播部分,使用live-pusher和live-player标签,然后用云直播即可 https://cloud.tencent.com/do...... 展开详请

为什么我通过控制台vnc看到的界面和用vnc viewer看的的界面不一样???

HappyLau谈云计算专注于公有云,私有云解决方案,在kubernetes,openstack,kvm,ceph,linux,shell有丰富的实战经验。
推荐

控制台页面使用的是novnc,novnc是一种基于web页面使用的vnc客户端,详情可参考https://github.com/novnc/noVNC介绍,常规的vnc viewer是图形的客户端,所使用的依赖库有所不同,因此显示也不一样。

API获取域名列表一直AuthFailure,code:4100?

zqfan

腾讯 · 高级工程师 (已认证)

推荐
推荐使用SDK进行调用:https://github.com/QcloudApi/qcloudapi-sdk-python 如果要自己写,也请参考下签名文档中python的代码示例,或者SDK中的源码:https://github.com/QcloudApi/qcloudapi-...... 展开详请

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励