首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Websockets上排序不佳的数据

Websockets上排序不佳的数据
EN

Stack Overflow用户
提问于 2013-02-07 20:49:59
回答 3查看 1.5K关注 0票数 3

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

服务器端使用炼金术Websockets实现(C#),因为我发现很容易理解/修改。

我正在利用websockets、示例、 found 这里这里以及炼金术中的示例。

我使用HighCharts以“实时”显示数据。,但是为了调试目的,我也让它将打印到div (独立的示例,这样它们就不会相互干扰)。

它已经运行得很好了,但是当我发送数据太快时,会出现一个明显的问题(为了清楚起见,每一秒或两秒钟发送一个点的数据,就会产生一个很好的图,它看起来没有任何问题--问题越快,我把炼金术服务器称为“发送”函数的速度就越明显)。

这些数据似乎是以错误的顺序输入的,从而产生了有趣的“损坏”效应。

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

这个错误是不一致的,因为每当我重新加载页面时,都会导致不同的“损坏”数据集。这使我怀疑websockets上的通信是负责的,或者是涉及炼金术服务器的。

如果有必要的话,我会附上完整的代码,但是现在它相当混乱,所以我更多的是寻找疑难解答的想法。

我已经收集到,这不是web套接字的预期行为,因为它是建立在TCP上的。

对于需要查看的东西,有什么suggestions/ideas吗?

谢谢!

编辑:每次刷新页面时,我都会运行另一个测试,以检查有多少数据点出现故障。这些数字如下:

1 2 3 25 6 5 10 11 96 2 8

非常不一致(从来没有0)。当然很有趣!

这一结果是通过排除图表组件并仅使用websockets和一个数组来存储数据来实现的。

更新:

我决定开始分析进来的订单,它看起来确实是在随机地使用相同的数据集接收出订单点。我实现了一个“插入”函数,它将考虑到无序包。结果(加上一个小小的主题变化)看起来相当不错!

悬而未决的问题仍然是:是否期望websocket可以无序地传递信息?或者服务器端的实现(或炼金术)有什么问题。有时间我会进一步调查的。

解决方案!

我想出来了!经过大量测试后,我意识到我的连接对象(它负责监视新数据的数据集,并根据连接的配置方式酌情发送)是使用Timer对象实现的。这是我从一个例子中学到的东西(通常我只是在大多数情况下使用Thread对象异步)。

随着Timer对象速度的加快,它将开始异步执行,这是它以前对其Tick函数的调用。这意味着,对它的Tick函数的调用有时会比另一个调用要快一些(因为Alchemy函数中的延迟)。这会引起轻微的无序问题。

I将通信循环的实现从一个 计时 对象切换到一个 线程 对象,从而强制同步,无序数据包就消失了!

EN

回答 3

Stack Overflow用户

发布于 2013-02-08 00:18:55

Websockets使用TCP,TCP保证按顺序传送数据。

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

使用这个简单的Node应用程序来测试:

代码语言:javascript
复制
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消息,每条消息都要增加一个数字。客户:

代码语言:javascript
复制
<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>

如果控制台收到的消息包含的数字不超过上一条消息,则抛出一个控制台警告。

在Chrome和Firefox中,我看到了零条坏消息。

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

换句话说,--这是设置中的其他东西。最有可能的是,炼金术服务器实际上是以不同的顺序发送消息。

票数 1
EN

Stack Overflow用户

发布于 2013-02-08 22:11:58

不使用,这是一个像计时这样的对象,在任务同步时具有异步回调。使用a 线程并以这种方式运行通信循环。

票数 0
EN

Stack Overflow用户

发布于 2015-11-13 10:02:16

我不知道这个问题是什么时候发布的。我也有类似的问题。我使用炼金术客户端发送小数据,这样就没有问题了。聊天服务有很多例子。但是,当我发送一些文件超过4KB(不准确)时,问题就会发生。我试着找出发生了什么。我写了一个程序,由炼金术客户端从0-7000发送号码,从UserContext.DataFrame(onreceive)收到,DataFrame.ToString会在508位置得到额外的"\0\0\0\0"。那么,在这个位置之后,数据排序将是错误的。我用了nuget的2.2.1。我在GiHub上读了2.0版。源代码是不可行的。所以,对旧的和没有参考价值。

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

https://stackoverflow.com/questions/14760736

复制
相关文章

相似问题

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