主頁 > .NET開發 > webform 和 winform 之間如何進行socket通信?

webform 和 winform 之間如何進行socket通信?

2020-09-25 18:20:41 .NET開發

需求如下:

服務器端  BS架構  使用 webform 或 mvc 都可以

客戶端  CS架構  使用 winform

客戶端的數量不確定,大于等于1,小于等于100

服務器端與客戶端是一對多的關系


服務器端系統有固定的IP地址和埠號,始終對外保持監聽,客戶端程式啟動以后,自動連接服務器端,如果被服務器端監聽到,則雙方建立連接,如果是第一次訪問,就在資料庫表里插入一條資料,記錄該客戶端的IP地址,如果不是第一次訪問,說明該客戶端資訊已存在,則更新一下最近一次的連接時間


服務器端系統中有一個頁面,把資料庫表中的所有記錄用表格的形式顯示出來,如果某個客戶端和服務器為連接狀態,則該條記錄高亮顯示,如果某個客戶端和服務器未連接,則該條記錄的背景色為灰色


因為會有多個客戶端同時操作,隨時可能建立連接或者取消連接,所以上面那個頁面每分鐘自動重繪一次,實時更新客戶端的連接狀態


上面那個頁面的表格中有兩列,

一列放了一個文本框和一個按鈕,文本框中可以輸入訊息,然后點擊按鈕發送,也就是說該頁面可以給每一個正在連接的客戶端發送訊息(一對一的,不是群發,不是廣播)

還有一列,放一個多行文本框,用來顯示每個客戶端給服務器發送的訊息



請問以上功能如何實作?

webform 和 winform 之間如何進行socket通信?

服務器端(B/S系統,webform 或 mvc)應該如何保持監聽?

希望大家給點兒思路,如果能夠提供源代碼,那就最好了,謝謝!

uj5u.com熱心網友回復:

webform 和 winform通過服務器進行通信。


WebClient通過SignalR等網頁實時技術,連接到服務器,允許服務器推送資訊(連接狀態,訊息狀態等等)。
WinFormClient的選擇就更多了,比如也可以用SignalR。

服務器,連接著所有的WebClient,WinformClient,起資訊中轉,派送的功能。

uj5u.com熱心網友回復:

看了半天,我覺得你思路相當混亂!我覺得你還是先理清思路再說。一般好的設計,不會有Web頁面和Winform通信這種需求,因為Web頁面是時刻變化的,你要求它保持一個監聽,這不是扯淡嗎?

而樓上說的通過服務器進行通信,拜托,這叫“通信”?

我們也有需要同時使用B/S和C/S的,一般B/S為主,C/S為輔。當需要轉C/S時,直接在Web頁面上提供一個按鈕,以自定義協議的方式啟動本地C/S客戶端,傳入session,直接連到服務器。

多客戶端對服務器的同步/異步操作,網上應該有很多例子的。

uj5u.com熱心網友回復:

額,服務器bs,客戶端cs。??

你是說web服務器,和winform程式么。

webapi 訪問注冊一下就行了。至于你說什么展示頁面,那跟winfrom沒有毛線關系。因為他是脫離的,你是依賴資料庫也好,依賴redis快取也罷,依賴etcd,cosorl注冊中心都無所謂。他本質上無需跟下面通訊,他就是只是一個展示

當然你要跟下面發訊息嘛,websocke可以,mq可以。

本質上你應該隔離,脫離開。不要動不動就玩技術。越玩技術越低級

uj5u.com熱心網友回復:

或者干脆說,你就是一個標準的CS。只是服務器端能有一個webapi承載,以便外部有個html頁面跟他互動。

實際上這也是主流方式,比如rabbitmq,他只是標準的服務,但是他內部承載一個webapi(或內部承載和web服務器)他有個html頁面對外顯示

uj5u.com熱心網友回復:

這其實也是以后的主要方向,你看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,其實以后的專案都會如我上面說的“你別管什么技術,全部脫離,各玩各的,需要配合的時候配合,不需要配合的時候,自己獨立”

uj5u.com熱心網友回復:

樓主的意思大概是需要一個服務端去一直回應客戶端的連接,然后有一個web網頁去看各個客戶端連過來的情況。并且客戶端與服務端的連接情況是實時反饋到網頁上進行查看的。我做過類似的專案,網頁上大概是下面的情況。


跟樓主說一下我做的時候大致的思路。

一開始我也想著,服務端已經有一個web專案部署在IIS上了,那么只需要這個web專案可以隨時的監聽到相關埠,保持和客戶端的通訊就行了,這個簡單,我在web頁面上做一個按鈕,類似于開始監聽這種,點擊按鈕,通過web api介面打開相應業務功能,開始監聽客戶端連接,然后服務端收到的訊息后處理客戶端連接的訊息,再通過signalR來主動地把服務端訊息推送到web頁面,來完成實時的訊息更新。

后來我發現web專案的服務端去做一些比較"主動"的事情的時候總是吃力的,因為IIS總是用來回應客戶端的請求,http連接總是連接完畢后就釋放了,它是無狀態的你無法通過web api來確認一個客戶端是否在線,除非你有在客戶端做定時發送心跳這種處理。再然后,比如我的Web專案有api更新,需要我重新發布內容的時候,我的監聽功能也會被迫關閉,發布完成后需要重新打開。并且通過服務端主動地向web頁面推送訊息這么看起來也不是特別的“服務端”,總是覺得很別扭,特別是當你推送的內容需要跟前臺登錄地權限掛鉤時,這些東西設計起來就變得有一些復雜。

后來我就另外起了一個控制臺應用,將所有主動的事情都放在了這個控制臺里進行,控制臺應用一直開著,埠就一直保持監聽的狀態,這就非常的"主動"了,控制臺應用接收到的所有的資料,該存資料庫存資料庫,如果web網頁需要頻繁查詢的一些資料,包括一些訊息推送的佇列,我選擇存在了redis里。包括你希望的在網頁端通過點擊一個按鈕向各個客戶端發送訊息,通過redis的訂閱和發布功能,你都可以辦到。

那么web端網頁訊息的實時更新我也不再選擇使用signalR去主動推送,由前端自己定義定時器來輪詢向服務器發送請求。最后完成的效果還可以。

這樣的話負責處理客戶端連接和訊息處理的是控制臺程式,web后臺僅僅作為查詢和展示。

最后,將這個控制臺程式注冊為windows服務設定開機自動啟動,就可以了。


最后我本人是個新手,以上僅供參考。

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/127350.html

標籤:C#

上一篇:“Button1_Click”不是“ASP.default_aspx”的成員。 怎么解決啊?

下一篇:ssrs 郵件訂閱圖表縮放問題,變形問題

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more