【问题标题】:Socket.io server not listening to connection eventSocket.io 服务器未监听连接事件
【发布时间】:2016-07-17 05:34:42
【问题描述】:

我对 Node.js 很陌生。我正在使用 socket.io 构建一个实时提要应用程序。

我正在使用http://socket.io/get-started/chat/ 开始我的应用程序。 结合快递

以下是我的服务器代码

/**
 * Module dependencies.
 */
var express = require('express');
var logger = require('morgan');
var routes = require('./routes');
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);

// log requests
app.use(logger('dev'));
app.use('/rest', routes.userInfo, routes.matchList, routes.teamList,
        routes.completedMatchList);

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

app.listen(3006);

console.log('listening on port 3006');

然后我的应用程序的 web 文件夹中有一个 index.html。

我只是使用纯代码来初始化客户端套接字,如下所示

 <script src="/node_modules/socket.io/node_modules/socket.io-client/socket.io.js"></script>     
<script>
  var socket = io();
</script>

我启动了我的服务器并且它运行良好 但即使在客户端页面加载并提供服务后,连接事件也不会被监听,代码也不会在控制台“用户已连接”中打印。

只是补充一点,我在中间使用了一个应用程序路由器,它从端口 5000 开始。

我在 chrome 控制台中检查过,它不断报告错误,例如

http://localhost:5000/socket.io/?EIO=3&transport=polling&t=LF2viiR

http://localhost:5000/socket.io/?EIO=3&transport=polling&t=LF2vj0v

快照我的 chrome 控制台出现错误

干杯,

苏拉夫

【问题讨论】:

  • 介意更新您从 chrome 控制台收到的错误吗?由于这些 url 是 localhost,因此无法查看它们。
  • @ckross01 感谢您的回复...更新了我的 chrome 控制台的快照...
  • 看起来您的前端代码需要端口 5000,但您的快速服务器正在侦听 3006
  • 正如我所说,我的应用路由器正在端口 5000 上运行
  • 明白了,路由器是否将 http 101 请求转发到您的 express 服务器?

标签: node.js sockets socket.io


【解决方案1】:

在这种情况下,您不能使用 app.listen(),因为您没有使用 Socket.io 正在使用的 HTTP 实例进行侦听。

您在创建时将您的 express 实例 app 传递给您的 HTTP 实例 http。因此app 被用作http 的基础。然后在创建io 时将http 传递给socket.io

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

您需要做的是使用您的 http 变量进行监听,因为这是您实例化 io 的服务器。将您的 app.listen() 更改为 http.listen()

【讨论】:

  • 比您的输入...做到了,但没有给出相同的结果
  • @saurav “不给出相同的结果”是什么意思?这样做会得到什么样的结果?
  • 我的意思是,当 socket.io 尝试轮询并且服务器未响应连接事件时,它会给出与 chrome 报告 404 错误相同的结果
【解决方案2】:

首先通过 npm 安装 socket.io npm install socket.io --save,

节点程序(后端):

代替:

app.listen(3006);

改成:

  http.listen(port, function(err) {
    if (err) {
        console.log(err);
    } else {
        console.log("Listening on port 8080");
    }
});

前端:

如果你的 Node 程序和 Frontend 程序运行在 localhost 的同一个端口,那么,

<script src="/socket.io/socket.io.js"></script>     
<script>
  var socket = io();
</script>

Node 程序和 Frontend 程序运行在两个不同的端口。

<script src="http://localhost:5000/"></script>

<script>
  var socket = io("http://localhost:5000/socket.io/socket.io.js");
</script>

如果节点程序没问题,希望它能工作。

【讨论】:

    【解决方案3】:

    非常感谢您的意见和帮助。

    我做的几件事帮助我解决了这个问题。

    (a) 我用 io.connect("url") 代替 io()。

    (b) 服务器 index.js 中变量和依赖项初始化的二阶排序

    这两个解决方案都受到此链接的启发

    SocketIO- GET http://localhost:3000/socket.io/?EIO=3&transport=polling&t=1418187395022-0 404 (Not Found)

    干杯,

    苏拉夫

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      • 1970-01-01
      • 2021-02-28
      • 2011-09-28
      • 2018-04-05
      相关资源
      最近更新 更多