Home > Net >  How to make the socket communication between webform and winform?
How to make the socket communication between webform and winform?

Time:10-08

需求如下:

服务器端 BS架构 使用 webform 或 mvc 都可以

客户端 CS架构 使用 winform

客户端的数量不确定,大于等于1,小于等于100

服务器端与客户端是一对多的关系


服务器端系统有固定的IP地址和端口号,始终对外保持监听,客户端程序启动以后,自动连接服务器端,如果被服务器端监听到,则双方建立连接,如果是第一次访问,就在数据库表里插入一条数据,记录该客户端的IP地址,如果不是第一次访问,说明该客户端信息已存在,则更新一下最近一次的连接时间


服务器端系统中有一个页面,把数据库表中的所有记录用表格的形式显示出来,如果某个客户端和服务器为连接状态,则该条记录高亮显示,如果某个客户端和服务器未连接,则该条记录的背景色为灰色


因为会有多个客户端同时操作,随时可能建立连接或者取消连接,所以上面那个页面每分钟自动刷新一次,实时更新客户端的连接状态


上面那个页面的表格中有两列,

一列放了一个文本框和一个按钮,文本框中可以输入消息,然后点击按钮发送,也就是说该页面可以给每一个正在连接的客户端发送消息(一对一的,不是群发,不是广播)

还有一列,放一个多行文本框,用来显示每个客户端给服务器发送的消息



请问以上功能如何实现?

How to make the socket communication between webform and winform?

服务器端(B/S系统,webform 或 mvc)应该如何保持监听?

希望大家给点儿思路,如果能够提供源代码,那就最好了,谢谢!

CodePudding user response:

webform 和 winform通过服务器进行通信,


WebClient通过SignalR等网页实时技术,连接到服务器,允许服务器推送信息(连接状态,消息状态等等),
WinFormClient的选择就更多了,比如也可以用SignalR,

服务器,连接着所有的WebClient,WinformClient,起信息中转,派送的功能,

CodePudding user response:

看了半天,我觉得你思路相当混乱! 我觉得你还是先理清思路再说,一般好的设计,不会有Web页面和Winform通信这种需求,因为Web页面是时刻变化的,你要求它保持一个监听,这不是扯淡吗?

而楼上说的通过服务器进行通信,拜托,这叫"通信"?

我们也有需要同时使用B/S和C/S的,一般B/S为主,C/S为辅,当需要转C/S时,直接在Web页面上提供一个按钮,以自定义协议的方式启动本地C/S客户端,传入session,直接连到服务器,

多客户端对服务器的同步/异步操作,网上应该有很多例子的,

CodePudding user response:

额,服务器bs,客户端cs,??

你是说web服务器,和winform程序么,

webapi 访问注册一下就行了,至于你说什么展示页面,那跟winfrom没有毛线关系,因为他是脱离的,你是依赖数据库也好,依赖redis缓存也罢,依赖etcd,cosorl注册中心都无所谓,他本质上无需跟下面通讯,他就是只是一个展示

当然你要跟下面发消息嘛,websocke可以,mq可以,

本质上你应该隔离,脱离开,不要动不动就玩技术,越玩技术越低级

CodePudding user response:

或者干脆说,你就是一个标准的CS,只是服务器端能有一个webapi承载,以便外部有个html页面跟他交互,

实际上这也是主流方式,比如rabbitmq,他只是标准的服务,但是他内部承载一个webapi(或内部承载和web服务器)他有个html页面对外显示

CodePudding user response:

这其实也是以后的主要方向,你看net core和java的spring boot 就明白了,

这个两个都在脱离,net core脱离iis,spring boot脱离tomcat,因为后面的项目不强调什么cs,bs,
后面项目强调隔离和按需配置

你这个玩意,如果按目前的方式开发,其实没那么麻烦和纠结

后端服务net core,内部承载webapi以便和H5 web展示,内部通讯按需取用,比如一个consoul用来注册客户端发现,一个mq,kafaka用来做通讯,就ok了,

后端服务net core 去监控consoul/etcd 的注册节点(带过期策略),这个可以用webapi提供给外面展示,内部通讯你是一对多也好,一对一也罢,俺们不管,一个mq,kafaka丢出去,谁爱订阅谁订阅,
你点击一个按钮,这个按钮会说,我的publish key是啥,你管他要干嘛,不管,我只会给这个key发,当然这个key你可以etcd/consoul对应的客户节点上获取,他上线就给你注册说"我要这个key的,我监听这个key的"(过期策略会告诉这节点已下线,你可以不用操作了)


so,整个过程,我们不说什么CS,BS,也不说什么webform,winfrom,跟不说什么socket,singlR,其实以后的项目都会如我上面说的"你别管什么技术,全部脱离,各玩各的,需要配合的时候配合,不需要配合的时候,自己独立"

CodePudding user response:

楼主的意思大概是需要一个服务端去一直响应客户端的连接,然后有一个web网页去看各个客户端连过来的情况,并且客户端与服务端的连接情况是实时反馈到网页上进行查看的,我做过类似的项目,网页上大概是下面的情况,


跟楼主说一下我做的时候大致的思路,

一开始我也想着,服务端已经有一个web项目部署在IIS上了,那么只需要这个web项目可以随时的监听到相关端口,保持和客户端的通讯就行了,这个简单,我在web页面上做一个按钮,类似于开始监听这种,点击按钮,通过web api接口打开相应业务功能,开始监听客户端连接,然后服务端收到的消息后处理客户端连接的消息,再通过signalR来主动地把服务端消息推送到web页面,来完成实时的消息更新,

后来我发现web项目的服务端去做一些比较"主动"的事情的时候总是吃力的,因为IIS总是用来响应客户端的请求,http连接总是连接完毕后就释放了,它是无状态的你无法通过web api来确认一个客户端是否在线,除非你有在客户端做定时发送心跳这种处理,再然后,比如我的Web项目有api更新,需要我重新发布内容的时候,我的监听功能也会被迫关闭,发布完成后需要重新打开,并且通过服务端主动地向web页面推送消息这么看起来也不是特别的"服务端",总是觉得很别扭,特别是当你推送的内容需要跟前台登录地权限挂钩时,这些东西设计起来就变得有一些复杂,

后来我就另外起了一个控制台应用,将所有主动的事情都放在了这个控制台里进行,控制台应用一直开着,端口就一直保持监听的状态,这就非常的"主动"了,控制台应用接收到的所有的数据,该存数据库存数据库,如果web网页需要频繁查询的一些数据,包括一些消息推送的队列,我选择存在了redis里,包括你希望的在网页端通过点击一个按钮向各个客户端发送消息,通过redis的订阅和发布功能,你都可以办到,

那么web端网页消息的实时更新我也不再选择使用signalR去主动推送,由前端自己定义定时器来轮询向服务器发送请求,最后完成的效果还可以,

这样的话负责处理客户端连接和消息处理的是控制台程序,web后台仅仅作为查询和展示,

最后,将这个控制台程序注册为windows服务设置开机自动启动,就可以了,


最后我本人是个新手,以上仅供参考,

  •  Tags:  
  • C#
  • Related