C# c/s 网络通信 大数据传输方式选择

问题描述

上位机(主控室)与多个下位机通信(TCP/ip通信),接收多个下位机(大约100台)传过来的数据,每台下位机的数据量大约100k/s。两种接收方式:1.上位机开辟多线程,每个线程分别与每台下位机相连。下位机分别实时主动送数据,100个线程并行传输数据会不会有问题?2.上位机采用轮询方式,向某台下位机要数据,单线程即可解决,这样不会出现并行传输数据的问题,但是需要在每台下位机装配IP主节点存储下位机的数据,增加了成本。由于现在只实现了上位机与两台下位机连接,采用的方式1,目前对100台下位机连接时有疑惑和顾虑。请问上述数据接收处理方式是否合理?有没有更合理的接收方式?

解决方案

解决方案二:
引用楼主u010018424的回复:

1.上位机开辟多线程,每个线程分别与每台下位机相连。下位机分别实时主动送数据,100个线程并行传输数据会不会有问题?

服务器端通讯应该是异步并发的,就算是10万个下位机与上位机进行实时通讯,在某一个瞬间,你也不能说有100001个线程在那里死循环着。可能一个线程都不用,或者可能最多(瞬间)用20个线程,总之不能纠结那么多线程数。有些人完全是滥用线程去胡写代码,这可能跟msdn上某个具体通讯语句的特殊“范例”的误导有关,也可能是跟10几年前某些java书上的例子有关。比如说,.net中对属性的改变进行监听,实际上应该使用的编程模式是INotifyPropertyChanged接口。而有些人偏偏说“我用一个死循环执行的线程,不是仅能‘监控’变量值了吗?”。再比如说,当用将桌面上的窗口拖到桌面边缘时应该将窗口收缩起来,有的人就会滥用一个50毫秒的定时器不断轮询判断窗口是否在桌面边缘,而实际上应该使用的方式是捕获窗口被拖动的事件去判断.....基于滥用轮询、线程的方式编程,这从出发点就是错的。假设你只是1、2个线程滥用,也许你觉得没有什么。顶多就是电脑似乎卡了一点点,“还能忍受”。但是你需要迅速从2个线程过渡到“1万个线程”的情况,此时你不可能随手有20G内存、1000GHz主频的CPU,你还是得老老实实地使用“事件驱动”的异步编程思路。此时一个线程都不用,根本就跟线程数无关。100个下位机跟上位机实时连接,这不占用1个线程。你怎么反而能说要占用100个线程呢?可见你现在程序该立刻重写。
解决方案三:
电脑要干什么异步的事情,首先想到的是“注册好事件捕获机制”。你不用调用人家的方法,人家回回调你的。如果你的思路就是滥用“线程”,那就没救了。
解决方案四:
你不用调用人家的方法,人家回回调你的-->你不用调用人家的方法,人家会回调你的线程这个高大上的词儿让一些人疯狂。msdn上某个通讯语句的错误的阻塞式编程“范例”也助长了这种任性滥用线程的情况。实际上,如果只是在偶尔仅仅有1、2个连接且1分钟才需要连接一次的短连接的例子,才可能随便那样编程。
解决方案五:
用消息队列。下位机往上位机发数据,上位机用一个线程收数据,然后不做任何处理丢到消息队列中,上位机后台再开N个线程去处理消息队列中的任务。如果担心一个线程接收慢,多开几个也行,搞个线程池。上面的模型对付数百并发足够了,如果并发几千几万,可以参考完成端口模型。
解决方案六:
引用1楼sp1234的回复:

Quote: 引用楼主u010018424的回复:
1.上位机开辟多线程,每个线程分别与每台下位机相连。下位机分别实时主动送数据,100个线程并行传输数据会不会有问题?

服务器端通讯应该是异步并发的,就算是10万个下位机与上位机进行实时通讯,在某一个瞬间,你也不能说有100001个线程在那里死循环着。可能一个线程都不用,或者可能最多(瞬间)用20个线程,总之不能纠结那么多线程数。有些人完全是滥用线程去胡写代码,这可能跟msdn上某个具体通讯语句的特殊“范例”的误导有关,也可能是跟10几年前某些java书上的例子有关。比如说,.net中对属性的改变进行监听,实际上应该使用的编程模式是INotifyPropertyChanged接口。而有些人偏偏说“我用一个死循环执行的线程,不是仅能‘监控’变量值了吗?”。再比如说,当用将桌面上的窗口拖到桌面边缘时应该将窗口收缩起来,有的人就会滥用一个50毫秒的定时器不断轮询判断窗口是否在桌面边缘,而实际上应该使用的方式是捕获窗口被拖动的事件去判断.....基于滥用轮询、线程的方式编程,这从出发点就是错的。假设你只是1、2个线程滥用,也许你觉得没有什么。顶多就是电脑似乎卡了一点点,“还能忍受”。但是你需要迅速从2个线程过渡到“1万个线程”的情况,此时你不可能随手有20G内存、1000GHz主频的CPU,你还是得老老实实地使用“事件驱动”的异步编程思路。此时一个线程都不用,根本就跟线程数无关。100个下位机跟上位机实时连接,这不占用1个线程。你怎么反而能说要占用100个线程呢?可见你现在程序该立刻重写。

谢谢哥哥的详细耐心的回答。其实开始用多线程编程就是图省事,保证数据独立、安全。拿方式1来说,说是下位机主动送,其实只有我主动去读,下位机才送过来数据。在每个线程中收到的数据,进行异步存储和显示(初始时用的委托事件,但是数据量大,处理不过来),然后再读下一次。开的线程会一直连续接收数据,不是短链接。
解决方案七:
引用4楼intraweb的回复:

用消息队列。下位机往上位机发数据,上位机用一个线程收数据,然后不做任何处理丢到消息队列中,上位机后台再开N个线程去处理消息队列中的任务。如果担心一个线程接收慢,多开几个也行,搞个线程池。上面的模型对付数百并发足够了,如果并发几千几万,可以参考完成端口模型。

谢谢,我去学习一下消息队列
解决方案八:
引用3楼sp1234的回复:

你不用调用人家的方法,人家回回调你的-->你不用调用人家的方法,人家会回调你的线程这个高大上的词儿让一些人疯狂。msdn上某个通讯语句的错误的阻塞式编程“范例”也助长了这种任性滥用线程的情况。实际上,如果只是在偶尔仅仅有1、2个连接且1分钟才需要连接一次的短连接的例子,才可能随便那样编程。

http://bbs.csdn.net/topics/391034226我的问题和连接里的问题差不多,都是长连接,不用开多线程吗?

时间: 2024-07-31 21:58:17

C# c/s 网络通信 大数据传输方式选择的相关文章

虚子雨:企业网站推广之节省成本的SEO方式选择

大家好,我是虚子雨.前面我给大家介绍了自己的优势和爱好就是优化企业网站的,一般我优化的网站架子不会太大,可能是因为自己的能力不够,或者是因为自己想逃避承担更多的责任造成了这种爱好.其实看似企业网站好优化,但是却不是那么回事.企业老板都是人精,从开始不懂SEO,到慢慢的熟悉以及想通过SEO获取什么样的效果都是非常清楚地,现在简单SEO忽悠一些不懂的老板也许可行,但是想持久的为一个企业提供SEO,必须要做到健康性和可持续性,要通过SEO为企业赚到钱,这样才是老板喜欢看到的,也是老板愿意和你合作的.

仅次于CN域名博客的第二大应用方式

拥有一个电子邮箱已司空见惯,但拥有一个用自己名字命名的CN域名邮箱则颇为新鲜,也成为许多时尚年轻人彰显个性的新选择.据了解,CN域名个性邮箱在青年学生中已经拥有为数庞大的"粉丝",成为仅次于CN域名博客的第二大应用方式. 记者了解到,CN域名邮箱的个性化主要体现在其独有的姓名后缀,相对于"163.com"或"chinaren.com"等统一的网站邮箱后缀,CN域名邮箱则以个人姓名为后缀而显得独一无二."用自己的名字做邮箱后缀既容易让人记

控制-destoon的数据传输方式

问题描述 destoon的数据传输方式 destoon的后台显示页面如何把数据提交到后台控制页面的?具体代码是什么?

文件读取-vc想通过单击按钮弹出对话框的方式选择某TXT文件

问题描述 vc想通过单击按钮弹出对话框的方式选择某TXT文件 我已经获取了文件路径,GetPathName,如何再获取文件中的数据 txt文件中的数据格式是这样的, 1 2 3 4 5 6 请问我接下来该怎么操作,才能使各个数据全部被提取出来. 解决方案 VC弹出"选择文件"和"选择文件夹"对话框VC弹出"选择文件"和"选择文件夹"对话框VC弹出"选择文件"和"选择文件夹"对话框

Android网络通信的实现方式_Android

Android网络编程分为两种:基于http协议的,和基于socket的.基于Http协议:HttpClient.HttpURLConnection.AsyncHttpClient框架等基于Socket: (1)针对TCP/IP的Socket.ServerSocket (2)针对UDP/IP的DatagramSocket.DatagramPackage (3)Apache Mina框架一.HttpURLConnection的实现方式 String response = null; Url url

ajax数据传输方式实例详解_AJAX相关

本文实例讲述了ajax数据传输方式.分享给大家供大家参考,具体如下: 在异步应用程序中发送和接收信息时,常见的可以选择以纯文本和XML作为数据格式(可参考<jQuery学习笔记之Ajax用法实例详解>),现在还有一种比较流行的方式:JSON(JavaScript Object Notation).好了,下面举例说明这三种数据格式在ajax的异步应用. 一.纯文本方式 1.发送/接收数据: Code is cheap.看代码: testJs.js // 此函数等价于document.getEle

ajax数据传输方式实例详解

本文实例讲述了ajax数据传输方式.分享给大家供大家参考,具体如下: 在异步应用程序中发送和接收信息时,常见的可以选择以纯文本和XML作为数据格式(可参考<jQuery学习笔记之Ajax用法实例详解>),现在还有一种比较流行的方式:JSON(JavaScript Object Notation).好了,下面举例说明这三种数据格式在ajax的异步应用. 一.纯文本方式 1.发送/接收数据: Code is cheap.看代码: testJs.js // 此函数等价于document.getEle

Android网络通信的实现方式

Android网络编程分为两种:基于http协议的,和基于socket的. 基于Http协议:HttpClient.HttpURLConnection.AsyncHttpClient框架等 基于Socket: (1)针对TCP/IP的Socket.ServerSocket (2)针对UDP/IP的DatagramSocket.DatagramPackage (3)Apache Mina框架 一.HttpURLConnection的实现方式 String response = null; Url

新浪微博申请大屏幕能否选择大屏幕的版本?

  目前标准版是免费的,可以满足您的基本需求: 1.sp号码配备,短彩.wap.web等多种用户参与方式; 2.管理员操作简单,信息安全,一键式审核(可取消审核)系统; 3.详细的数据统计功能.气泡版.3D版.字幕版属于有偿服务. sp号码介绍:每个大屏幕申请通过后,均有一个专属的大屏幕号码,用户可以直接通过发送短信到这个指定的号码,参与大屏幕互动 大屏幕管理后台介绍:每个大屏幕申请通过后,都会有一个专属的审核后台,只能在邮件通知的时间段使用申请时的帐号才能登录,其他帐号均无法登录,管理员根据活