webform 和 winform 之间如何进行socket通信?

铁血男儿007 2019-08-11 03:57:39
需求如下:

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

客户端 CS架构 使用 winform

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

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


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


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


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


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

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

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



请问以上功能如何实现?

webform 和 winform 之间如何进行socket通信?

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

希望大家给点儿思路,如果能够提供源代码,那就最好了,谢谢!
...全文
431 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
iAm_Ike 2019-08-12
  • 打赏
  • 举报
回复
楼主的意思大概是需要一个服务端去一直响应客户端的连接,然后有一个web网页去看各个客户端连过来的情况。并且客户端与服务端的连接情况是实时反馈到网页上进行查看的。我做过类似的项目,网页上大概是下面的情况。 跟楼主说一下我做的时候大致的思路。 一开始我也想着,服务端已经有一个web项目部署在IIS上了,那么只需要这个web项目可以随时的监听到相关端口,保持和客户端的通讯就行了,这个简单,我在web页面上做一个按钮,类似于开始监听这种,点击按钮,通过web api接口打开相应业务功能,开始监听客户端连接,然后服务端收到的消息后处理客户端连接的消息,再通过signalR来主动地把服务端消息推送到web页面,来完成实时的消息更新。 后来我发现web项目的服务端去做一些比较"主动"的事情的时候总是吃力的,因为IIS总是用来响应客户端的请求,http连接总是连接完毕后就释放了,它是无状态的你无法通过web api来确认一个客户端是否在线,除非你有在客户端做定时发送心跳这种处理。再然后,比如我的Web项目有api更新,需要我重新发布内容的时候,我的监听功能也会被迫关闭,发布完成后需要重新打开。并且通过服务端主动地向web页面推送消息这么看起来也不是特别的“服务端”,总是觉得很别扭,特别是当你推送的内容需要跟前台登录地权限挂钩时,这些东西设计起来就变得有一些复杂。 后来我就另外起了一个控制台应用,将所有主动的事情都放在了这个控制台里进行,控制台应用一直开着,端口就一直保持监听的状态,这就非常的"主动"了,控制台应用接收到的所有的数据,该存数据库存数据库,如果web网页需要频繁查询的一些数据,包括一些消息推送的队列,我选择存在了redis里。包括你希望的在网页端通过点击一个按钮向各个客户端发送消息,通过redis的订阅和发布功能,你都可以办到。 那么web端网页消息的实时更新我也不再选择使用signalR去主动推送,由前端自己定义定时器来轮询向服务器发送请求。最后完成的效果还可以。 这样的话负责处理客户端连接和消息处理的是控制台程序,web后台仅仅作为查询和展示。 最后,将这个控制台程序注册为windows服务设置开机自动启动,就可以了。 最后我本人是个新手,以上仅供参考。
github_36000833 2019-08-11
  • 打赏
  • 举报
回复
webform 和 winform通过服务器进行通信。 WebClient通过SignalR等网页实时技术,连接到服务器,允许服务器推送信息(连接状态,消息状态等等)。 WinFormClient的选择就更多了,比如也可以用SignalR。 服务器,连接着所有的WebClient,WinformClient,起信息中转,派送的功能。
wanghui0380 2019-08-11
  • 打赏
  • 举报
回复
这其实也是以后的主要方向,你看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,其实以后的项目都会如我上面说的“你别管什么技术,全部脱离,各玩各的,需要配合的时候配合,不需要配合的时候,自己独立”
wanghui0380 2019-08-11
  • 打赏
  • 举报
回复
或者干脆说,你就是一个标准的CS。只是服务器端能有一个webapi承载,以便外部有个html页面跟他交互。 实际上这也是主流方式,比如rabbitmq,他只是标准的服务,但是他内部承载一个webapi(或内部承载和web服务器)他有个html页面对外显示
wanghui0380 2019-08-11
  • 打赏
  • 举报
回复
额,服务器bs,客户端cs。?? 你是说web服务器,和winform程序么。 webapi 访问注册一下就行了。至于你说什么展示页面,那跟winfrom没有毛线关系。因为他是脱离的,你是依赖数据库也好,依赖redis缓存也罢,依赖etcd,cosorl注册中心都无所谓。他本质上无需跟下面通讯,他就是只是一个展示 当然你要跟下面发消息嘛,websocke可以,mq可以。 本质上你应该隔离,脱离开。不要动不动就玩技术。越玩技术越低级
super_admi 2019-08-11
  • 打赏
  • 举报
回复
看了半天,我觉得你思路相当混乱!我觉得你还是先理清思路再说。一般好的设计,不会有Web页面和Winform通信这种需求,因为Web页面是时刻变化的,你要求它保持一个监听,这不是扯淡吗?

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

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

多客户端对服务器的同步/异步操作,网上应该有很多例子的。
基于C#的物联网核心Socket通信源码:高效管理多连接,数据缓冲队列,可内嵌至各类项目,简单易用,适合初学者与项目急用,不含数据处理与异步技术。,Socket服务器和客户端通信源码,C#编写,这是从 一个商业级的物联网项目分离出来的核心代码,让你绕过最难写的Socket管理,服务器内置两个Socket,支持多连接,有两个数据缓冲队列,,仅一个静态类文件,调用即可获得客户端传上来的数据。 客户端带断线重连功能,简单实用,能内嵌于任何基于C#语言编写的项目中(MVC、Winform、控制台、Webform,类库……),适合初学者或有迫切要完成项目需求使用。 特别说明: 1、 本代码仅是连接和提供收到的数据,并不对数据进行处理,因为代码并不知道你收到的数据含义,但提供了数据读取接口。 2、 本连接使用的不是异步技术。 3、 由于各人代码风格和思路差异较大,很难说得清楚值不值,在联系之前,请尽可能描述清楚你的应用场景需求。 4、 本代码的应用场景是服务器和客户端通过互联网或局域网互发byte[]或字符串数据,如果不是类似的场景,请慎 ,核心关键词: Socket服务器; 客户端通信源码;
C#商业级物联网项目核心:Socket服务器与客户端通信源码,支持多连接带重连功能,简易集成任何C#项目,数据接收无处理,基于C#的物联网核心Socket通信源码:多连接支持,数据缓冲队列,客户端断线重连功能,适用于各类C#项目,Socket服务器和客户端通信源码,C#编写,这是从 一个商业级的物联网项目分离出来的核心代码,让你绕过最难写的Socket管理,服务器内置两个Socket,支持多连接,有两个数据缓冲队列,,仅一个静态类文件,调用即可获得客户端传上来的数据。 客户端带断线重连功能,简单实用,能内嵌于任何基于C#语言编写的项目中(MVC、Winform、控制台、Webform,类库……),适合初学者或有迫切要完成项目需求使用。 特别说明: 1、 本代码仅是连接和提供收到的数据,并不对数据进行处理,因为代码并不知道你收到的数据含义,但提供了数据读取接口。 2、 本连接使用的不是异步技术。 3、 由于各人代码风格和思路差异较大,很难说得清楚值不值,在联系之前,请尽可能描述清楚你的应用场景需求。 4、 本代码的应用场景是服务器和客户端通过互联网或局域网互发byte[]或字符串数据,
基于C#的TCP Socket服务器端通信源码,商业级物联网项目核心代码,支持多连接与数据读取,简易管理,适合初学者和项目需求使用。,Socket tcp服务器端通信源码,C#编写,服务器端部分,这是从一个商业级的物联网项目分离出来的核心代码,让你绕过最难写的Socket管理,内置两个Socket,有两个数据缓冲队列,,仅一个静态类文件,调用时一个激活语句即可,之后开两个线程或定时器读数据即可获得客户端传上来的数据。 简单实用,支持多连接连接,能内嵌于任何基于C#语言编写的项目中(MVC、Winform、控制台、Webform,类库……),提供技术文档,适合初学者或有迫切要完成项目需求使用。 特别说明: 1、 本代码仅是连接和提供收到的数据,并不对数据进行处理,因为代码并不知道你收到的数据含义,但提供了数据读取接口。 2、 本连接使用的不是异步技术。 3、 由于各人代码风格和思路差异较大,很难说得清楚值不值,在联系之前,请尽可能看清楚描述是不是你的需求 4、 本代码的应用场景是服务器接受客户端通过互联网或局域网连接并和客户端收发byte[]或字符串数据,如果不是类似的场景,请慎 ,

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧