1 前言
由於某些原因需要多個客戶端之間實時同步,由服務端主動推送,但是定時推送這種實在不太行,於是考慮了這類技術。由於主要是用.net開發,所以主要考慮這方面。
最開始是准備用的signalr,但被否決了,認為signalr兼容其他技術背的包袱太重,而且還要jQuery這種,需要輕裝上陣。
由於signalr主要也是使用websocket技術,加上微軟也有system.net.webscoket這么個命名空間,於是就決定用純粹的這個來做,winform做服務端,客戶端方面winform、web頁面乃至APP端都能支持。
不過由於中文互聯網上對於system.net.webscoket這個命名空間的資料也太少了,可能因為太簡單大佬們都懶得動,導致我找資料非常的艱難。由於我本人水平很一般,沒有詳細資料代碼的時候一頭霧水,勉強拼湊出能運行的程序后看文檔反而多了不少頭緒。這里也分享一下我的websocket學習歷程,幫助一下想研究一下這么個偏門東西但有實力有限不得不多走彎路的人吧。
2 websocket介紹
2.1 websocket技術
搬運一下別人的介紹吧:
WebSocket是HTML5提供的一種在單個 TCP 連接上進行全雙工通訊的協議,目前chrome、Firefox、Opera、Safari等主流版本均支持,Internet Explorer從10開始支持。另外因為WebSocket 提供瀏覽器一個原生的 socket實現,所以直接解決了 Comet 架構很容易出錯的問題,而在整個架構的復雜度上也比傳統的實現簡單得多。
WebSocket本質上是一個基於TCP的持久化協議,相對於HTTP這種非持久的協議來說,它能夠更好的節省服務器資源和帶寬,並且真正實現實時通信。其優點在前面我們已經做了對比,最大的缺點就是對舊版本瀏覽器不支持。至此SignalR的出現,完美的解決了種瀏覽器的問題,SignalR不僅可以實現WebSocket的所有功能,還對舊版本瀏覽器做了支持。SignalR可自動或手動選擇使用WebSocket傳輸還是其他替代方式傳輸,以實現實時Web技術。
相當於在HTTP連接中弄了個TCP連接,看成web端的socket協議即可(然而半吊子的我沒研究過socket,哭o(╥﹏╥)o)
2.2 c# websocket
給一個微軟文檔地址 https://docs.microsoft.com/zh-cn/dotnet/api/system.net.websockets?view=netframework-4.5
是websocket有關的一些類,非專業出身,干看這個我真的不知道怎么寫代碼,不過和代碼對照使用卻還挺有用處。
其實還有一個 https://docs.microsoft.com/zh-cn/dotnet/api/system.web.websockets?view=netframework-4.5.1
這是system.web.websocket,看名字估計是用在.net web程序中的吧,反正我沒用到。
注意:如果你是用system.net.websocket編寫客戶端,那你客戶端所運行的計算機,必須是win8及以上並且framework4.5及以上。如果是win7的,對不起,會報錯。
https://blog.csdn.net/LongtengGensSupreme/article/details/84029552
我測試過,是這樣的。
2.3 C# websocket開發包
所以其實有一些開發包提供了dll,可以很方便地使用C# websocket,而且不必顧及系統版本。見 https://www.oschina.net/translate/websocket-libraries-comparison-2
我其實大部分都試了,首先是signalr,其實挺不錯,各平台都能使用,微軟官方支持,可以看這本書《asp.net signalr 編程實戰》,寫的挺好。
然后是fleck,這個真的很贊,只需要很少代碼就能實現功能,和web端代碼一樣簡潔,可惜fleck只提供服務端編寫,可以在github上搜,網上這個項目的使用教程非常多。
還有websocket-sharp,顧名思義,專門為c#設計的,也在github上有,介紹教程非常詳細,客戶端服務端都支持,不過網上資料相對較少,我用起來也有點點別扭。
如果不是實在需要用純粹的websocket,看到這里可以走了,選fleck或者websocket-sharp乃至兩者同時使用都行。
3 環境
我是win10,VS2013,項目framework4.5。除了不要是win7,其他倒沒啥關系。
4 看過的博客等資料
在學習的過程中,參考了很多的資料,下面列出一些我收藏為書簽的:
https://www.cnblogs.com/Code-life/p/6142926.html
https://blog.csdn.net/xieyu2205638/article/details/73160385
https://blog.csdn.net/zt102545/article/details/85139419
https://github.com/paulbatum/WebSocket-Samples
另外在谷歌上,Stack Overflow上也看了一些(外網這方面資料畢竟還是多一些啊)
下一篇開始進入正題