javascript - Socket IO不断断开并重新连接
问题描述
我对sockets和socket.io非常陌生,所以如果这是一个明显的问题,我深表歉意。我正在为 Socket.IO 使用 C# 客户端并运行本地 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 窗体应用程序)中,与套接字相关的唯一代码行是实例变量private Socket socket = IO.Socket("http://localhost:3000/");
。然而由于某种原因,服务器反复接收连接和断开事件。这是我的控制台的屏幕截图:
screenshot
这一切都会在我运行我的 C# 程序时自动发生,无需任何交互,并在我关闭它时立即停止。关于它为什么不断连接/断开的任何想法?
编辑:无论出于何种原因,当我从项目中删除 Newtonsoft.json 时,问题似乎消失了。但是,如果没有它,我将无法像其他人一样使用 Emit 功能。有解决方法吗?
解决方案
对于遇到此问题的任何人,请检查客户端和服务器是否使用相同的协议版本。
在高层次上,这很可能是由服务器和客户端之间的协议版本不匹配引起的。我在 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 在实现 ping-pong 机制方面有着重大变化的历史,这可能是根本原因。
推荐阅读
- reactjs - 通过 Provider React 传递对象
- html - 基于复选框的角度禁用输入
- angular - 将捕获的视频上传到服务器
- mysql - Presto SQL 中的 IN 谓词有多昂贵?当子查询产生非常大的结果集时,Presto 是否会在后台进行任何优化?
- pine-script - 如何制作和指标仅在 4 小时时间范围内显示?
- mysql - 继续添加外键
- azure - azure ml - 如何从存储帐户中的文件共享注册训练数据集(表格)
- html - 如何垂直对齐图像和文本?
- json - 未处理的异常:FormatException:在颤振中使用 json.decode 时出现意外字符
- python - 条形图的注释