当前位置: 首页 > 知识库问答 >
问题:

为什么带socket.io的nodejs服务器会在连接上造成无休止的循环?[副本]

上官凯泽
2023-03-14

我们是一个由2名开发人员组成的小组,试图用节点js和Socket.io实现一个简单的聊天服务器。我们使用的是GitHub。当我拉出我的伙伴更改并启动npm时,我发现我的控制台在一个无休止的循环中输出“一个用户被连接”。

下面是代码(用于输出连接过一次的用户的部分:socket.on('user login',function(newuser)...).index.js:

//dependencies
var app = require('express')();
var http = require('http').Server(app); //http server
//initialize a new instance of socket.io by passing http server
var io = require('socket.io')(http);
var users = []; //List of online users
app.get('/', function(req, res){
  res.sendFile(__dirname + '/index.html');
});

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

  socket.on('disconnect', function(){
    console.log('user: '+socket.username + ' logged out.');
    var date = new Date();
    io.emit('info message', {timestamp: date.toUTCString(), user: socket.username + ' logged out.'});
    //TO DO: Delete user from list.
  });

...

index.html脚本:

<script src="https://cdn.socket.io/socket.io-2.1.1.js"></script>


<script>

$(function () {
          var socket = io();

          /*
          * On submit of form with id 'entername' client sends entered username to server.
          * After sending div-Container loginDiv will be hidden and messageDiv will be shown.
          * And last: set value of usernameinput to ''.
          * */
          $('#enterName').submit(function () {
             //console.log($('#userNameInput').val());
             socket.emit('user login',$('#userNameInput').val());
             $('#loginDiv').hide();
             $('#messageDiv').show();
             $('#userNameInput').val('');
             return false;
          });
});
</script>

package.json依赖项:

"dependencies": {
    "body-parser": "^1.18.3",
    "express": "^4.16.3",
    "socket.io": "^2.1.1"
  }

共有1个答案

隆礼骞
2023-03-14

正如我所怀疑的那样,我不得不在客户端和服务器端使用相同的socket.io版本。因此,我再次安装了socket.io(服务器端),获取该版本(在package.json中的dependencies下找到该版本),并在https://cdnjs.com/libraries/socket.io/中搜索脚本src,以便绑定到我的html中,以便将其加载到客户端。在我的例子中更新了index.html scriptsource:

  <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.1.1/socket.io.js"></script>

之前,我只是将版本号改为src,而没有搜索正确的URL。

 类似资料:
  • 在连接上创建infinte循环!很奇怪,直到现在才发生。我不知道出了什么问题。我试图重建包,我复制一些代码从旧的源代码和相同的结果...

  • 所有运行在localhost上,node到web页面的端口为8001,node.js到可执行文件的端口为8002。请原谅代码,因为我已经试着让这个工作了几天,现在有点难看。 要执行的cmd可执行文件及其参数来自工作的网页。我可以启动EXE。EXE希望每个发送的消息都有一个ACK,这就是为什么您会看到代码将其发回。 我在网页上设置和更新元素时有一个间隔。我还有一个设置消息(msg)的元素。

  • 当我开始我的代码 我得到无限循环。为什么?

  • 但是如果我在这个循环中打印了一些内容,那么它就不会终止。为什么会这样?

  • 问题在代码的注释中,很抱歉,我认为它更整洁,因为流程很重要,我想。。。 //*这是来自Oracle:(https://docs.oracle.com/javase/6/docs/api/java/util/Scanner.html#hasNextInt()) ”hasNextInt 公共布尔值hasnetint() 如果此扫描仪输入中的下一个标记可以使用nextInt()方法解释为默认基数中的in

  • 问题内容: 以下示例在Node.js书中给出: 解释了while循环为何阻止执行时,作者说: 节点将永远不会执行超时回调,因为事件循环卡在了循环中,而循环在第7行开始了,因此永远不会给它处理超时事件的机会! 但是,作者没有解释为什么这是在事件循环的背景下发生的,还是在幕后真正发生了什么。 有人可以详细说明吗?为什么节点卡住?以及如何在保留控制结构的同时更改上述代码,以使事件循环不会被阻塞,并且代码