【问题标题】:socket.io not working node.jssocket.io 不工作 node.js
【发布时间】:2015-05-21 02:44:01
【问题描述】:

我无法在 node.js 中运行 socket.io 代码,console.log() 在运行代码时也不显示。下面是代码。

app.js

var express = require('express');
var http = require('http');
var app = express();
app.set('port', process.env.PORT || 3000);
app.post('/testStream',test.testStream);
var server = http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

module.exports.appServer = server;

我已经创建了一个 test.js 文件,我在其中访问这个导出的变量 appServer。

var server = require('../app.js');

exports.testStream = function(req,res){        
    var io = require('socket.io').listen(server.appServer);
    io.on('connection',function(socket){
        console.log("in socket");
        fs.readFile('E:/temp/testimg.png',function(err,buf){
            socket.emit('image',{image: true,buffer: buf});
            console.log("test image");
        });
    })       
}

当代码运行时,它会卡住并且不显示 console.logs()。我在这里做错了什么。非常感谢任何帮助。

【问题讨论】:

  • @cbass,这一行已经在代码中了。我可以更新问题吗?
  • http createServer 不同步,因此当您导出该模块时,该服务器未启动,请尝试使用 process.nextTick() 使该代码异步
  • @Tim,谢谢。你能用一些例子指导我吗?这对我真的很有帮助。
  • 嘿,这里的主要问题是你从 app.js 导出了错误的变量,你检查了 doc socket.io,你假设导出了 http.createServer(app),你绑定了错误的 var
  • @Tim,我不是在给 var server 赋值吗?我想这应该可以工作 var server = http.createServer(app).listen(app.get('port'), function(){ console.log('Express server监听端口' + app.get('port') ); });

标签: node.js express socket.io


【解决方案1】:

我建议遵循 socket.io 文档中建议的代码结构。

此外,您应该在您的 testStream express 中间件中调用 io.listenio.on('connection')。这些是你应该只做一次的事情,理想情况下它们应该在启动期间发生,在 app.js 内部,而不是响应 POST 请求。事实上,我不确定你的testStream 中间件的目的是什么,它甚至没有返回任何响应(例如res.end()

如果您想在单独的模块中处理套接字连接,您可以,但不要像现在这样导出应用程序的 server,而是尝试将 io 实例作为变量传递给您的子模块。简而言之,试试这个:

app.js

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var test = require('./test')(io);

app.set('port', process.env.PORT || 3000);

server.listen(app.get('port'), function() {
    console.log('Express server listening on port ' + app.get('port'));
});

test.js

module.exports = function(io) {
    io.on('connection', function(socket) {
        console.log("in socket");
        fs.readFile('E:/temp/testimg.png', function(err, buf) {
            socket.emit('image', {
                image: true,
                buffer: buf
            });
            console.log("test image");
        });
    });
};

【讨论】:

  • testStream 服务的目的是向客户端(即设备)提供图像/视频字节流。我能够通过流(在base64中)发送字节流,但是在阅读更多内容时我开始知道,即通过套接字发送字节流更有效。如果您能给我更多的想法,如何以更有效的方式将视频字节流发送到设备,那对我有很大帮助吗?
  • 在此评论部分讨论对其他 stackoverflow 用户来说几乎没有发现用处。我建议您尝试按照“节点视频流”的方式使用谷歌搜索并尝试您找到的内容。如果您确实遇到任何具体问题并需要帮助,您可以随时发布新问题。
  • 谢谢。实际上,我几天前已经发布了一个关于这方面的问题。 stackoverflow.com/questions/30234622/…
猜你喜欢
  • 1970-01-01
  • 2017-09-10
  • 2021-07-28
  • 2021-12-15
  • 2017-07-21
  • 1970-01-01
  • 2012-04-26
  • 2016-11-26
  • 1970-01-01
相关资源
最近更新 更多