首先,對於大家而言,想必對網絡傳輸並不陌生,因爲我們每天都在下載“文件”。嘻嘻!!!但是如果讓我們自己寫一個網絡文件傳輸的程序,估計大家都傻眼了,今天小編就給大家以最簡單的方式,讓C#初學者能夠快速開發出實用的Socket文件傳輸程序。
溫馨提示:在看本篇之前首先得有socket編程,也就是能收發消息就行。
所需工具:
- VS2017及以上版本
- Internet網絡
- 電腦一臺
- 基礎編程人員一名
- 還有必不可少的程序集。RRQMSocketFramework.dll(可以直接可以去Nuget下載)
開始
準備好了以上工具,我們就開始吧!
首先我們先來介紹一下該程序集的一些功能
1.解決了95%的Tcp黏包的問題(其實理論上是100%,謙虛!!)
2. 服務器單線程託管客戶端,從而可以實現同時連接上萬的客戶端。
3. 可以發送和接收簡單文本以及數據對象(凡是可序列化的類都可以)
4. 可以發送和接收各種文件,支持斷點傳輸,多通道下載,多隊列下載。快速上傳等
5. 服務器可以設置客戶端的連接賬號和密碼(類似於ftp服務器)
6. 服務器支持多種工作模式以對應不同的高併發(後面會講到)
7. 可以適應於各種老機器(有緩存區大小設置)
8. 下載、上傳速度顯示,進度顯示。
9. 服務器設置最大上傳速度,最大下載速度。
10. 可以長連接進行數據交換,也可以進行短連接
2020.5.17 上線版本(版本號:4.1.3)
更新內容:
- 取消文件類的速度限制
- 可以設置最大下載速度和上傳速度
- 優化數據包處理邏輯,降低申請內存的頻率
- 分類學習版和專業版,創建獨立的類開銷更小
- 取消構造函數傳參,直接由屬性賦值傳遞
- 完美兼容Winform組件式開發,對於這些工具類,您可以像設計Button一樣,直接設置其參數,相對應的事件也可以像Button的Click事件一樣,通過雙擊註冊。當然也不影響直接使用類。
2020.5.18 緊急更新(版本號:4.1.5)
更新內容:
- 對應用戶要求,加入禁用心跳服務器屬性
- 由於失誤,更改了命名空間,現已調回。
2020.6.24更新(版本號:4.2.5)
更新內容:
1.客戶端增加了傳輸數據對象並等待返回的方法,該方法可以異步調用,而且不會出現返回數據混亂的現象。
2.開放所有的序列化,反序列化方法,可供使用者自定義序列化傳輸類型
3.增加數據加密方法,但是由於性能原因,並沒有在傳輸數據時默認開啓,使用者可以先調用加密方法進行加密,然後再傳輸。
更新圖示:
服務器學習版和專業版功能對比
功能 | 學習版 | 專業版 |
---|---|---|
連接客戶端 | √ | √ |
事件觸發 | √ | √ |
上傳文件 | √ | √ |
下載文件 | √ | √ |
上傳數據對象 | √ | √ |
下載數據對象 | √ | √ |
網速顯示 | √ | √ |
網速限制 | √ | √ |
是否適用老機器 | √ | √ |
隊列下載文件 | √ | √ |
設置連接賬號和密碼 | × | √ |
設置服務器工作模式 | × | √ |
使用簡單客戶端和服務器 | × | √ |
文件下載,上傳的斷點續傳功能 | × | √ |
使用時間限制 | √ | × |
工作時是否聯網 | × | × |
高穩定性 | √ | √ |
能否使用後續更新版本 | √ | √ |
能否根據自身業務,進行個性化定製功能 | × | √ |
第一步 程序集引用
在聯網的情況下搜索“RRQMSocketFramework”,如果版本較低或者是破解版的話,就去Nuget官方網站自行下載,然後自行引用。
第二步 引入命名空間
- 引入命名空間“RRQMSocket”
- 實例化工具類類
第一個創建的是學習版的實例,具體功能看程序集註釋
第二個是高級企業版,可以設置賬號,密碼,服務器模式等
RRQMService service = new RRQMService();
service.IP = "192.168.1.1";
service.Port = 1024;
ResultStatus status = service.BindSocket();
if (status.Status)
{
MessageBox.Show("服務器建立成功");
}
RRQMService MainService = new RRQMService(setting);
MainService.Account = "123";
MainService.PassWord = "abc";
MainService.ServerMode = ServerMode.SingleThread;
MainService.SleepTime = 0;
MainService.LicenceKey = "許可證需聯繫作者購買,QQ505554090";
MainService.ReceiveObject += MainService_ReceiveObject;
MainService.IP = "192.168.43.150";
MainService.Port = 7789;
ResultStatus result = MainService.BindSocket();
if (result.Status)
{
this.MesText = "綁定成功";
}
第三步 創建客戶端實例並連接
RRQMClient client = new RRQMClient();
ConfirmSocket confirm = new ConfirmSocket();
confirm.Account = "123";
confirm.Account = "abc";
confirm.TargetIP = "192.168.1.1";
confirm.TargetPort = 1024;
confirm.WaitingTime = 1;
confirm.Flag = "測試連接";
ResultStatus status = client.Connect(confirm);
if (status.Status)
{
MessageBox.Show("連接成功");
}
else
{
MessageBox.Show(status.Message);
}
這四步完成以後,程序集的對象的創建就完成了,接下來看下基本功能實現
事件
事件的綁定服務端和客戶端基本一致,這裏就以客戶端爲例。每個事件都有詳細的註釋
事件裏面的參數信息,以接收文件爲例
發送文本類信息
1、客戶端→服務器
2、服務器→客戶端
客戶端下載,上傳文件
1、客戶端下載
2、客戶端上傳
程序集基本原理就這些,接下來再給大家看看關於本程序集的高級操作!!!!!!!
1. 服務端創建模式
多線程--------------指每鏈接一個客戶端,就會創建一個新線程。其優點是可以很快速地響應客戶端請求。缺點是客戶端數量不能太多,不然服務器喫不消,一般適用於繁重的數據交換的情況,比如:客戶端經常會下載文件等情況。
單線程--------------不管鏈接多少客戶端,始終使用一個線程進行數據處理,其優缺點與多線程恰好相反。適用於多連接,高併發,單數據交換較小的情況。
用戶自定義--------------設置線程管理客戶端數量,意爲一個線程管理的最大客戶端數。當該線程管理的客戶端數爲0的時候會退出該線程。(溫馨提示:每個線程都是滿負荷在運行,所以儘量控制總線程數,不宜太多)
2.各種小設置
- 設置服務器接收文件目錄
- 設置客戶端接收文件目錄
- 設置文件下載“斷點續傳”功能
- 設置文件上傳“斷點續傳”功能
簡單服務器和客戶端性能表現
單次循環50000次(在一臺電腦測試時,短時間內最好不要超過六萬,以免佔用完所有端口)連接併發送數據,僅用8.9s,使用內存僅60M(WPF程序,本身就耗內存)
單次循環60次連接併發送數據,耗時19ms.
在本地網絡中,單次訪問服務器並等待信息返回,用時不足1ms
簡單服務器和客戶端的意義:
對於項目中,文中所提到的文件傳輸類,顯然就顯得冗餘了,Tcp Socket建立連接本就需要時間,外加文件傳輸類中還需要驗證賬號,密碼,所以明顯不適合單次連接傳輸數據。而直接使用Socket,又覺得tcp粘包問題難以解決,而且使用複雜。所以使用簡單服務器和客戶端,就能完美解決該問題。既有文件傳輸類的便捷,又有Socket 的性能。
結束語:
教程到這裏也就基本結束了,但是這個程序集所展示的能力卻遠不止這些,比如上傳功能,多客戶端併發,多文件隊列下載,多通道下載同一文件等等,各位小夥伴結合事件,就能做出各種各樣的東西。如果還有小夥伴沒看懂文章內容的話,就點擊鏈接,直通B站視頻,裏面有關於這個程序集的介紹。也可以看看技術文檔下載 在線技術文檔。
此外也有一個應用案例案例介紹
當然如果還又什麼不明白的,可以私信小編哦,也可以加Q505554090