首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个简单的乒乓球socket.io例子会在短时间内失败?(数据有效载荷未定义)

问为什么这个简单的乒乓球socket.io例子会在短时间内失败?(数据有效载荷未定义)
EN

Stack Overflow用户
提问于 2020-04-29 16:05:34
回答 1查看 1.7K关注 0票数 1

我构建了一个非常简单的socket.io示例(在node.js客户机和服务器之间),因为我的整个socket.io连接一直在重新连接,这是为了调试出错的地方:

socket-server.js

代码语言:javascript
复制
const app = require('express')();
const server = require('http').Server(app);
const io = require('socket.io')(server);
server.listen(8080);
console.log("listening...")
let counter = 0;
setInterval(() => {
  let data = { beat: counter };
  console.log("sending ping", data);
  io.sockets.emit('ping', data);
  counter++;
}, 1000);
io.on("connection", (socket) => {
  console.log("connected to client");
  socket.on("pong", (data) => {
    console.log("pong", data.beat);
  });
});

socket-client.js

代码语言:javascript
复制
var io = require('socket.io-client')
var socket = io.connect('http://127.0.0.1:8080/', {
  reconnect: true
});
socket.on('connect', function(socket) {
  console.log('connected to server');
});
socket.on('ping', function(data) {
  socket.emit('pong', data);
  console.log('ping', data.beat );
});

我启动了服务器,然后过了一会儿,用两个单独的命令提示(Windows)启动了客户机。

socket-server.js输出

代码语言:javascript
复制
listening...
sending ping { beat: 0 }
sending ping { beat: 1 }
sending ping { beat: 2 }
connected to client
sending ping { beat: 3 }
sending ping { beat: 4 }
sending ping { beat: 5 }
sending ping { beat: 6 }
sending ping { beat: 7 }
sending ping { beat: 8 }
sending ping { beat: 9 }
sending ping { beat: 10 }
sending ping { beat: 11 }
sending ping { beat: 12 }
sending ping { beat: 13 }
sending ping { beat: 14 }
sending ping { beat: 15 }
sending ping { beat: 16 }
sending ping { beat: 17 }
sending ping { beat: 18 }
sending ping { beat: 19 }
sending ping { beat: 20 }
sending ping { beat: 21 }
sending ping { beat: 22 }
sending ping { beat: 23 }
sending ping { beat: 24 }
sending ping { beat: 25 }
sending ping { beat: 26 }
sending ping { beat: 27 }
sending ping { beat: 28 }
sending ping { beat: 29 }
sending ping { beat: 30 }
sending ping { beat: 31 }
sending ping { beat: 32 }

socket-client.js输出

代码语言:javascript
复制
connected to server
ping 3
ping 4
ping 5
ping 6
ping 7
ping 8
ping 9
ping 10
ping 11
ping 12
ping 13
ping 14
ping 15
ping 16
ping 17
ping 18
ping 19
ping 20
ping 21
ping 22
ping 23
ping 24
ping 25
ping 26
ping 27
C:\Users\jonat\..proj-path..\tests\socket-client.js:10
  console.log('ping', data.beat );
                           ^

TypeError: Cannot read property 'beat' of undefined
    at Socket.<anonymous> (C:\Users\jonat\..proj-path..\tests\socket-client.js:10:28)

由于本地主机上的连接,我的网络质量不会导致连接崩溃,那么是什么原因呢?我如何调试/修复这个问题?

我试过:

将socket.io

  • downgrading重新安装到2.2.0

  • changing将端口改为3000,而不是8080

  • restarting my PC
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-29 18:32:55

您的代码无法工作,因为ping和pong是套接字库的保留事件:https://socket.io/docs/emit-cheatsheet/ (最后)。

在输出中,您显示服务器端"pong“也不工作。我试着把“乒乓”改为“乒乓”,把“乒乓”改成“彭”,一切都很好。

最有趣的部分是pong没有工作,但是ping是工作的,并且每25点接收一个未定义的有效载荷,所以数据是未定义的,data.beat是一个错误。我认为这是因为socket IO正在执行他们自己的ping操作,每25秒就不包含任何有效负载。但那只是猜测。

无论如何,您的代码很好,请更改事件名称。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61506288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档