C# WebSocket上的无序数据

C# WebSocket上的无序数据,c#,javascript,websocket,highcharts,C#,Javascript,Websocket,Highcharts,我一直在学习如何通过WebSocket以“实时”方式交付和显示数据。在这种情况下,实时只意味着每隔.03到1秒从传感器(带图像处理的摄像头)读取数据。每个数据点由一个时间和一个值(t,v)组成,它们被编码为双倍(虽然在这种情况下时间总是一个整数,但我不认为它是整数) 服务器端使用实现(C#),因为我发现为了我的目的很容易理解/修改 我正在利用发现的WebSocket示例以及炼金术中包含的示例 我已经习惯了,但我也让它打印到一个div以进行调试(独立示例,这样它们就不会相互干扰) 它的大部分功能已

我一直在学习如何通过WebSocket以“实时”方式交付和显示数据。在这种情况下,实时只意味着每隔.03到1秒从传感器(带图像处理的摄像头)读取数据。每个数据点由一个时间和一个值(t,v)组成,它们被编码为双倍(虽然在这种情况下时间总是一个整数,但我不认为它是整数)

服务器端使用实现(C#),因为我发现为了我的目的很容易理解/修改

我正在利用发现的WebSocket示例以及炼金术中包含的示例

我已经习惯了,但我也让它打印到一个div以进行调试(独立示例,这样它们就不会相互干扰)

它的大部分功能已经非常好了,但是当我发送数据太快时,会出现一个明显的问题(要清楚,每隔一两秒钟发送一个点的数据会产生一个漂亮的图表,看起来没有任何问题-我称炼金术服务器为“发送”的速度越快,问题就越明显功能)

数据似乎是以错误的顺序输入的,导致了有趣的“扭曲”效应

我将开始深入研究服务器端缓冲区中包含的数据包顺序(当新用户连接并且已经运行时,服务器被指示发送一定数量的“历史”点-这将导致一个明显的问题,如上图所示)以及客户端通过查看时间戳来接收订单

错误是不一致的,每次我重新加载页面时,都会导致不同的“损坏”数据集。这让我怀疑WebSocket上的通信是由alchemy服务器引起的

如果有必要,我会附上完整的代码,但现在它相当混乱,所以我更多地寻找故障排除的想法

我发现这不是web套接字的预期行为,因为它是基于TCP构建的

有什么建议/想法可以看吗

谢谢

编辑:我运行了另一个测试来检查每次刷新页面时有多少数据点出现故障。有关数字如下:

12356510119628

非常不一致(从不为0)。真有趣

通过排除图表组件,仅使用WebSocket和数组存储数据,获得了此结果

更新:

我决定我应该开始分析有序的东西,它似乎是随机接收到的无序点使用相同的数据集。我实现了一个“insert”函数,它将考虑无序数据包。结果(加上一点主题变化)看起来不错

还有一个悬而未决的问题:是否期望websocket能够无序地传递信息?或者我在服务器端的实现(或Alchemy)是否有问题。有时间我会进一步调查

解决方案 我知道了!经过大量测试后,我意识到我的连接对象(负责监视数据集中的新数据,并根据连接的配置情况发送数据集)是使用计时器对象实现的。这是我从一个例子中得到的东西(通常我只使用Thread对象来处理大多数异步的事情)

随着计时器对象速度的加快,它开始与之前对其Tick函数的调用异步执行。这意味着偶尔,对其Tick函数的一次调用会比另一次调用快一点(由于Alchemy Send函数的延迟)。这会导致轻微的故障问题


我将通信循环的实现从一个对象切换到另一个对象,从而强制执行同步,无序的数据包消失了

WebSocket使用TCP,TCP保证数据按顺序传递

我希望浏览器也能按顺序触发websocket消息事件。在我的测试中,情况似乎就是这样

使用此简单节点应用程序测试:

var sio = require('socket.io')
    , http = require('http')
    , express = require('express')
    , app = express()
    , srv = http.createServer(app)
    , io = sio.listen(srv)
    , fs = require('fs')
    , idx = fs.readFileSync('index.html').toString()
    ;

app.get('/', function(req, res) {
    res.send(idx);
});

var i = 0;
setInterval(function() {
    io.sockets.emit('count', i++);
}, 1);

srv.listen(888);
这只是以尽可能快的速度发送websocket消息,每个消息的数量递增。客户:

<script src="/socket.io/socket.io.js"></script>
<script>
var last = 0;
var socket = io.connect('/');
socket.on('count', function(d) {
    if (d-1 != last) console.warn('out of order!', last, d);
    last = d;
});
</script>

var last=0;
var socket=io.connect('/');
socket.on('count',函数(d){
如果(d-1!=最后一个)console.warn('故障!',最后一个,d);
last=d;
});
如果接收到的消息包含的数字不比前一条消息多一个,则抛出控制台警告

在Chrome和Firefox中,我没有看到任何无序消息

我还尝试在messagereceived事件(
for(var I=0;I<1000000;I++){}
)中阻塞一段时间,以模拟导致消息排队的工作。消息事件仍按顺序激发


换句话说,这是您设置中的其他内容。最有可能的是,Alchemy服务器实际上以不同的顺序发送消息。

不要使用类似的对象,该对象在任务同步时具有异步回调使用a并以这种方式运行通信循环。

我不知道问题是何时发布的。我也有类似的问题。我用炼金术客户端发送小数据,然后就没有问题了。聊天服务有很多例子。但是当我发送的文件超过4KB(不是很精确)时,问题就出现了。我试图找出发生了什么事。我编写了一个程序,通过Alchemy客户端从0-7000发送数字,并从
UserContext.DataFrame(onreceive)
接收数据帧,将发生
DataFrame.ToString
将在大约508位置获得额外的
“\0\0\0”
。然后,在这个位置之后,数据