日期:2014-05-20  浏览次数:20804 次

客户端数据处理方案
各位大侠,我最近做一个项目,要开发一个客户端,遇到了一个这样的问题,场景主要点是这样的:
1. 创建一个客户端套接字,循环监听生产服务器,生产服务器会不定时地将生产线的生产数据传到我的客户端,我的客户端用套接收数据,至于生产服务器如何获取数据大家不用关心,我已经可以跟服务器通信,只取数据就好
2. 生产数据是以某种指定的格式发送过来的,要有一个解析过程,才能从字符串中获取到需要的生产数据,这是供应商的系统决定的,我只能照它的格式接收
3. 生产数据发送频率有点高,在数据发送过来的接收过程和2中提到的解析过程会产生大量的字符串创建操作,这样会有大量的对象被创建,对于内存有影响
4. 生产数据在接收到后通过解析要实时地显示成图表,同时还要保存到数据库中作为历史数据进行查询。

针对以上几个要求,大家给点意见,客户端这边要如何做才能保证以下几点:
1. 数据显示的实时性
2. 内存的管理
3. 数据库的数据插入

这个号刚建没多久,分数不多,还望大家海涵,帮我出出主意,谢谢大家了。


------解决方案--------------------
引用:
回1楼的兄台,我的客户端是直接连接供应商提供的生产系统所在的服务器的,服务器会不定时地将生产数据实时发过来,我觉得WCF在这种场景下不适用,我直接在客户端接收就好,现在问题就是,数据接收太频繁,导致大量的的string对象在托管堆上频繁创建,对内存有压力,而且数据还要实时展示,与此同时还要将数据插入到数据库中。


你的程序是那个所谓“生产服务器”的服务器,不是客户端。你说的“我直接在客户端接受就好”时会误导人的。

在你这个场景中,是先写客户端程序后写服务器程序,跟一般的开发和设计是倒着的。通常,生产服务器允许任意其它客户端注册,然后它以长连接方式不定时地推送消息。而你的这个所谓的“生产服务器”,我估计开发人员只懂短连接,不懂如何推送消息,因此把服务器写成了客户端程序。

不管string在“托管堆上”还是什么上面创建,跟你这个程序没有关系。你是否能写出一个测试来断言“内存不足”呢?如果可以断言,那么可以先考虑花几十块钱买跟内存条,然后才是修改自己的程序的问题。

收到的数据应该异步并发处理。只要异步的,“界面展示、插入数据库”都不会卡住通讯过程。
------解决方案--------------------
为什么要用死循环呢?

你做一个数据展示页面,然后定时去连接服务器获取数据再解析和展示就行了。

原理类似于网站一样,请求/接收/解析。

socket有接收事件吧,接收到就处理。没有数据就处于空闲,

你用死循环,没有接收数据也是忙着的,即使你用sleep