c#服务器段采集数据,多个客户端实时同步显示,该如何处理
c#服务器段采集数据,多个客户端实时同步显示
我有一台服务器,运行用c#写的程序通过串口连接设备实时采集数据。
我希望从其他任何电脑利用客户端程序实时动态的显示服务器上采集的数据。
如果用数据库实现的话,客户端程序不方便判断哪些数据是新数据,而且效率也很低。
于是想用Socket实现。本人小白啦,对Socket只是有耳闻而已。
在网上查了查资料,好像基本上就是两种模式。
1.Socket广播。 我的理解就是服务器向网内广播地址发送一条消息,路由器会在网内自动转发。网内的客户端被动的接收消息,刷新数据就可以了。
2.服务器打开并监听端口,被动接收客户端的请求,再响应。
但是第一种的做法,我担心当数据采集频率较高,或未来有多台以此种方式实现的服务器时,大量的广播信息会不会对网络造成负担。而且我们公司的内网是多个网段,用多台三层交换机连接到一起的。虽然IP互相都能Ping通,但是不知道广播数据能否转发到其他网段。而且广播貌似是用UDP协议实现的,看网上的解释,好像UDP不能保证数据传递的顺序,但是我的需求是客户端像心电图一样,显示的是一条连续变化的波形。第二种做法的话,需要客户端不停的发送请求,当客户端请求的频率和数据采集的频率不一致时,服务器端还要考虑是否已给给此客户端发送过最新的数据。而且当客户端数量较多的时候,会不会对服务器端程序造成压力,影响数据采集进程。
我理想的模式就是,服务器采集到数据之后,直接将数据发送到某个端口。客户端监听服务器的端口,当服务器端口数据有变化时,就将数据获取并显示出来。
看起来和上面第一种模式有些类似。但是我不希望广播,是通过客户端监听实现。不知道能用什么方法实现。
------解决思路----------------------
简单总结你说的两个“方法”,它们都是不可取的。
你的第一个方法,在稍微大一点的网络里(哪怕是一层楼房的交换机)通常也是不允许有广播风暴的。
你的第二个方法,是短连接轮询方式,也是用你的传统的轮询数据库的思路去硬套。尽管这个方式比轮询数据库方式可能快几十倍,而且不会造成服务器CPU占用率一直飙到很高,但是仍然是极低性能和难以支持处理能力扩展的。
你所希望的形式,叫做“长连接”。客户端只要连接到服务器上,就能随时收到服务器的消息推送。当然通常客户端也还是会在连接服务器之后,先把自己的注册信息发给服务器,服务器将客户端的注册信息认证了之后,以后才知道给哪一个Client推送信息。
------解决思路----------------------
工作流程应是这样的
1、客户端向服务端发送连接请求,并等待服务器数据返回。
不关闭连接
2、服务端将收到客户端建立的连接保存于 ArrayList
在获取采集的数据后,通过 Socket.Select 检查出保存的连接列表中仍然有效的连接
并向其发送数据
Socket.Select 同时可检出新的连接请求
------解决思路----------------------
只要长连接断开了,那么你服务端在发送数据的时候就会报错的
你加个try,捕获一下错误,出错了就把它移除出列表,不用再管它了
客户端自己负责断线重连
我有一台服务器,运行用c#写的程序通过串口连接设备实时采集数据。
我希望从其他任何电脑利用客户端程序实时动态的显示服务器上采集的数据。
如果用数据库实现的话,客户端程序不方便判断哪些数据是新数据,而且效率也很低。
于是想用Socket实现。本人小白啦,对Socket只是有耳闻而已。
在网上查了查资料,好像基本上就是两种模式。
1.Socket广播。 我的理解就是服务器向网内广播地址发送一条消息,路由器会在网内自动转发。网内的客户端被动的接收消息,刷新数据就可以了。
2.服务器打开并监听端口,被动接收客户端的请求,再响应。
但是第一种的做法,我担心当数据采集频率较高,或未来有多台以此种方式实现的服务器时,大量的广播信息会不会对网络造成负担。而且我们公司的内网是多个网段,用多台三层交换机连接到一起的。虽然IP互相都能Ping通,但是不知道广播数据能否转发到其他网段。而且广播貌似是用UDP协议实现的,看网上的解释,好像UDP不能保证数据传递的顺序,但是我的需求是客户端像心电图一样,显示的是一条连续变化的波形。第二种做法的话,需要客户端不停的发送请求,当客户端请求的频率和数据采集的频率不一致时,服务器端还要考虑是否已给给此客户端发送过最新的数据。而且当客户端数量较多的时候,会不会对服务器端程序造成压力,影响数据采集进程。
我理想的模式就是,服务器采集到数据之后,直接将数据发送到某个端口。客户端监听服务器的端口,当服务器端口数据有变化时,就将数据获取并显示出来。
看起来和上面第一种模式有些类似。但是我不希望广播,是通过客户端监听实现。不知道能用什么方法实现。
------解决思路----------------------
简单总结你说的两个“方法”,它们都是不可取的。
你的第一个方法,在稍微大一点的网络里(哪怕是一层楼房的交换机)通常也是不允许有广播风暴的。
你的第二个方法,是短连接轮询方式,也是用你的传统的轮询数据库的思路去硬套。尽管这个方式比轮询数据库方式可能快几十倍,而且不会造成服务器CPU占用率一直飙到很高,但是仍然是极低性能和难以支持处理能力扩展的。
你所希望的形式,叫做“长连接”。客户端只要连接到服务器上,就能随时收到服务器的消息推送。当然通常客户端也还是会在连接服务器之后,先把自己的注册信息发给服务器,服务器将客户端的注册信息认证了之后,以后才知道给哪一个Client推送信息。
------解决思路----------------------
工作流程应是这样的
1、客户端向服务端发送连接请求,并等待服务器数据返回。
不关闭连接
2、服务端将收到客户端建立的连接保存于 ArrayList
在获取采集的数据后,通过 Socket.Select 检查出保存的连接列表中仍然有效的连接
并向其发送数据
Socket.Select 同时可检出新的连接请求
------解决思路----------------------
只要长连接断开了,那么你服务端在发送数据的时候就会报错的
你加个try,捕获一下错误,出错了就把它移除出列表,不用再管它了
客户端自己负责断线重连