套接字IO不断断开连接并重新连接

时间:2020-06-01 20:28:00

标签: javascript c# sockets socket.io

我对sockets和socket.io非常陌生,所以如果这是一个明显的问题,我深表歉意。我正在使用C# client for Socket.IO,并且正在运行本地javascript服务器。这是我的app.js:

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

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

   socket.on('test', function () {
      console.log('Test run'); });


   socket.on('disconnect', function () {
      console.log('A user disconnected'); });

});

http.listen(3000, function() {
   console.log('listening on localhost:3000'); });

在我的主要C#类(它是Windows Forms应用程序)中,与套接字完全相关的唯一一行代码是实例变量private Socket socket = IO.Socket("http://localhost:3000/");。但是由于某种原因,服务器反复收到连接和断开连接事件。这是我的控制台的屏幕截图: screenshot

这一切在我运行C#程序时自动发生,没有任何交互,并在我关闭它后立即停止。关于它为什么保持连接/断开的任何想法?

编辑:无论出于何种原因,当我从项目中删除Newtonsoft.json时,问题似乎都消失了。但是,没有它,我将无法使用Emit函数以及其他函数。有解决方法吗?

1 个答案:

答案 0 :(得分:0)

遇到此问题的任何人,请检查客户端和服务器是否使用相同的协议版本。

在高层次上,这很可能是由于服务器和客户端之间的协议版本不匹配造成的。我在 JS 应用程序中遇到了同样的问题。结果我在客户端使用了一些旧版本的 socket.io,在服务器上使用了最新版本。在您提供的存储库中,我们可以找到:

// EngineIoClientDotNet/Src/EngineIoClientDotNet.mono/Parser/Parser.cs
public static readonly int Protocol = 3;

所以这个(现已弃用)客户端使用 Engine.IO 协议 v3。您没有提供您在服务器上使用的是哪个 socket.io 版本的信息,但它可能只是在 Engine.IO 协议上使用了不同的版本。

作为旁注,说得更底层:我猜客户端可能能够连接,但它没有以正确的方式(或其他方式)响应服务器的第一个 ping 命令。因此,连接立即断开。 Socket.IO 在乒乓机制的实现方式上有过重大改变的历史,这可能是根本原因。