服务器端使用Alchemy Websockets实现(C#),因为我发现它非常容易理解/修改,以适应我的需求。
我利用了在{{link2:此处}}和{{link3:此处}}找到的Websockets示例,以及Alchemy附带的示例。
我正在使用HighCharts来实时显示数据, 但我也将其打印到一个div中以进行调试(独立的示例,不会相互干扰)。
目前它已经工作得非常好了,但当我发送数据过快时就会出现明显的问题(明确一下,每秒或每两秒发送有关点的数据会产生漂亮的图形,看起来没有任何问题 - 当我更快地调用炼金术服务器“send”函数时,问题变得更加明显)。
数据似乎是以错误的顺序进入,导致出现有趣的“混乱”效果。 我将开始深入研究服务器端缓冲区中包含的数据包顺序(当新用户连接并且服务器已经运行时,服务器会被指示发送一定数量的“历史”点-这会导致像上面展示的那样的明显问题),以及通过查看时间戳来确定客户端接收顺序。
这个错误是不一致的,每次重新加载页面都会导致不同的“混乱”数据集。这让我怀疑websocket通信或者涉及到alchemy服务器的某些东西可能是原因。
如果需要,我会附上完整的代码,但现在它还比较杂乱,所以我更多地寻找故障排除的想法。
我已经了解到这不是web socket的预期行为,因为它是建立在TCP之上的。
有什么建议/想法可以供参考吗?
谢谢!
编辑:我进行了另一个测试,检查每次刷新页面时有多少数据点是无序的。数字如下:
1 2 3 25 6 5 10 11 96 2 8
非常不一致(从未为0)。确实很有趣!
这个结果是通过排除图表组件,仅使用Websockets和数组来存储数据得出的。
更新:
我决定开始分析数据的顺序,发现使用相同的数据集时似乎随机接收到了无序点。我实现了一个“插入”函数,将考虑无序数据包。结果(加上一点主题更改)看起来很不错!
一个开放性问题仍然存在:websocket是否有可能无序地传递信息?或者我的服务器端实现(或Alchemy)出了问题。我有时间会进一步调查。
解决方案!
我找到答案了!经过多次测试,我意识到我的Connection对象(负责监视数据集中的新数据并根据连接的配置发送数据)是使用Timer对象实现的。这是我从一个示例中学到的(通常我大多数异步任务都使用Thread对象)。
随着Timer对象加速,它开始异步地执行它以前对Tick函数的调用。这意味着极少数情况下,由于Alchemy Send函数的延迟,对它的Tick函数的一次调用会比另一次调用稍微快一些。这会导致轻微的乱序问题。