为什么这个简单的ping pong socket.io例子在短时间内就失败了?(数据有效载荷未定义)

问题描述 投票:0回答:1

我有一个非常赤裸裸的socket.io例子(在node.js客户端和服务器之间),我建立这个例子是因为我的整体socket.io连接一直在重新连接,这是我努力调试出了什么问题。

socket-server.js

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

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:

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:

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)

由于连接在localhost上,我的网络质量不会造成连接的崩溃,那么是什么原因呢?我如何调试解决这个问题?

我试过了

  • 重新安装socket. io
  • 降级到2.2.0。
  • 将端口改为3000而不是8080
  • 重启电脑
javascript node.js socket.io
1个回答
1
投票

你的代码没有工作,因为ping和pong是socket库保留的事件。https:/socket.iodocsemit-cheatsheet. 在最后)。

在你显示的输出中,服务器端的 "pong "也不能用。我试着把 "pong "换成 "pang",把 "ping "换成 "peng",一切都正常。

最有意思的是,pong就是不工作,但是ping却在工作,而且每25次ping都会收到一个未定义的payload,所以数据是未定义的,data.beat是一个错误。我会认为是因为socket IO正在做一个自己的ping,包括每25秒没有payload。但这只是猜测。

总之,你的代码很好,改一下事件名。

© www.soinside.com 2019 - 2024. All rights reserved.