【问题标题】:Socket IO Example套接字 IO 示例
【发布时间】:2016-07-30 10:17:33
【问题描述】:

我正在尝试使用套接字 io,以便可以动态更新站点上的数据:

编辑:更新代码

在 app.js 中:

var express = require('express');
var app = express();

var routes = require('./routes/index');
app.use('/', routes);

var server = require('http').createServer(app);
var io = require('socket.io')(server);

  io.on('connection', function(socket){
  socket.emit('news', {hello: 'world'}); 
  socket.on('my other event', function (data) {
  console.log(data);
  });
});

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

在 index.ejs 中:

<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://localhost:80');
socket.on('news', function(data) {
  socket.emit('my other event', {my: 'data'});
});
</script>

页面加载正确,但是 socketio 脚本什么也不做。我试图让代码尽可能简单。

Express 监听端口 80 输出到控制台正常。

在 www.

#!/usr/bin/env node

/**
 * Module dependencies.
 */

var app = require('../app');
var debug = require('debug')('untitled:server');
var http = require('http');

/**
 * Get port from environment and store in Express.
 */

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

/**
 * Create HTTP server.
 */

var server = require('http').Server(app);

//var io = require('socket.io')(server);

/**
 * Listen on provided port, on all network interfaces.
 */

server.listen(port);
server.on('error', onError);
server.on('listening', onListening);

/**
 * Normalize a port into a number, string, or false.
 */

function normalizePort(val) {
  var port = parseInt(val, 10);

  if (isNaN(port)) {
    // named pipe
    return val;
  }

  if (port >= 0) {
    // port number
    return port;
  }

  return false;
}

/**
 * Event listener for HTTP server "error" event.
 */

function onError(error) {
  if (error.syscall !== 'listen') {
    throw error;
  }

  var bind = typeof port === 'string'
    ? 'Pipe ' + port
    : 'Port ' + port;

  // handle specific listen errors with friendly messages
  switch (error.code) {
    case 'EACCES':
      console.error(bind + ' requires elevated privileges');
      process.exit(1);
      break;
    case 'EADDRINUSE':
      console.error(bind + ' is already in use');
      process.exit(1);
      break;
    default:
      throw error;
  }
}

/**
 * Event listener for HTTP server "listening" event.
 */

function onListening() {
  var addr = server.address();
  var bind = typeof addr === 'string'
    ? 'pipe ' + addr
    : 'port ' + addr.port;
  debug('Listening on ' + bind);
}

【问题讨论】:

    标签: javascript node.js sockets socket.io


    【解决方案1】:

    不太清楚您所说的“套接字脚本不做任何事情”是什么意思,因为您实际上并没有在客户端做任何事情!从无论如何发布的代码中。

    编辑:

    此代码适用于我在客户端和服务器上。

    server.js

    var express = require('express');
    var app = express();
    var http = require('http').Server(app);
    var io = require('socket.io')(http);
    
    app.set('view engine', 'jade');
    app.set('views', './views');
    
    app.get('/', function (req, res) {
      res.render('index');
    });
    
    io.on('connection', function (socket) {
      console.log('connected via server');
    });
    
    http.listen(3000, function () {
      console.log('app listening on port 3000');
    });
    

    index.jade(可以使用ejs或者html)

    html
        head
            script(src="/socket.io/socket.io.js")
            script.
                var socket = io.connect();
                socket.on('connect', function() {
                    console.log('greetings from client');
                });
        body
            h1 hello world
    

    您也可以尝试自己手动提供 socket.io-client 包。

    【讨论】:

    • 对不起,我试过了。它基本上什么都不做(不打印'来自客户的问候')。
    • 奇怪..你试过从服务器发出一个事件并在客户端捕获它吗?
    • 您不必为 socket.io 的客户端版本创建路由,因为 socket.io 库会自动执行此操作,并且它内置在 socket.io 的服务器版本中。所以,我看不出你在这里实际提供了什么答案。
    • @jfriend00 你是对的,我编辑了它,它仍然有效。我提到手动提供它的原因是因为他们已经尝试过并且它不起作用。只是建议尝试在屏幕上显示一些内容。
    【解决方案2】:

    检查app.get('port') 是否正常工作以及如何为静态网站提供服务。

    我尝试明确设置它并且有效:

    app.js

    var express = require('express');                                                                                
    var app = express();
    
    app.set('view engine', 'ejs');
    app.set('views', './views');
    
    app.get('/', function (req, res) {
      res.render('index');
    }); 
    
    var server = require('http').createServer(app);
    var io = require('socket.io')(server);
    
    io.on('connection', function(socket){
      socket.emit('news', {hello: 'world'}); 
      socket.on('my other event', function (data) {
      console.log(data);
      }); 
    }); 
    
    server.listen(3100, function(){
      console.log('Express listening on port ' + 3100);
    }); 
    

    index.ejs

    <script src="/socket.io/socket.io.js"></script>
    <script>
    var socket = io.connect('http://localhost:3100');
    socket.on('news', function(data) {
      socket.emit('my other event', {my: 'data'});
    });
    </script>
    

    如果静态站点托管在其他地方,则使用&lt;script src="http://localhost:3100/socket.io/socket.io.js"&gt;&lt;/script&gt;

    【讨论】:

    • 我的主页位于端口 80。我不确定要使用哪个端口。如果我使用 app.get('port') 它会输出 80,但如果我手动输入 80,我会收到一个错误,说它已经在使用中?不知道是不是跟www文件有关?
    【解决方案3】:

    终于解决了:

    Using socket.io in Express 4 and express-generator's /bin/www

    我必须对 express 4.0 进行一些更改

    【讨论】:

    • 正确的答案将显示您实际必须做出的改变。
    猜你喜欢
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多