日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ESFramework介绍之(16)―― Tcp数据自动发送器ITcpAutoSender

發(fā)布時間:2025/3/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ESFramework介绍之(16)―― Tcp数据自动发送器ITcpAutoSender 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

??? 我們已經(jīng)積累了這樣的經(jīng)驗:如果有一個大塊的數(shù)據(jù)需要通過Tcp發(fā)送,我們會采用異步的方式以避免當(dāng)前工作線程阻塞。那么,如果我們有多個線程需要同時發(fā)送大塊的數(shù)據(jù)了?每個線程都在NetworkStream或Socket上提交異步發(fā)送數(shù)據(jù)的請求會導(dǎo)致數(shù)據(jù)發(fā)送的混亂(多個線程同時在一個Socket上進(jìn)行寫操作),所以,我引入了前面介紹的線程安全的網(wǎng)絡(luò)流。在引入這個類后,似乎日子已經(jīng)很好過了,但是新的功能要求使得我需要尋找另外的解決方案。
??? 考慮一下這個情景:我們的即時通信軟件AgileIM在和好友進(jìn)行視頻聊天的同時,還要傳遞文字信息、音頻數(shù)據(jù)、重要文件數(shù)據(jù)、控制命令等。而需要被傳送的這些信息是有優(yōu)先級順序的,比如,控制命令的優(yōu)先級最高,文件數(shù)據(jù)的優(yōu)先級較低,而視頻數(shù)據(jù)/音頻數(shù)據(jù)在網(wǎng)絡(luò)特別繁忙的時候是可以丟棄的。為了管理這些優(yōu)先級,僅僅依靠ISafeNetworkStream已經(jīng)不能滿足我們的要求,我們需要另外一個組件來為我們解決這個問題,ESFramework提供的ITcpAutoSender組件正是為此目的的。

??? 我們知道,在多線程的環(huán)境中對像Socket這樣臨界資源的訪問必須保證線程安全,從另外一個角度來看,可以這么說,對某個臨界資源的訪問必須是同步的或者說必須是“仿單線程”的。 ITcpAutoSender就利用了這一“仿單線程”特性使的問題簡單化。我們來看看這個組件究竟是如何工作的?
??? 我們的應(yīng)用程序中的各個線程當(dāng)有數(shù)據(jù)需要發(fā)送時,就將數(shù)據(jù)提交ITcpAutoSender,提交時必須指定該數(shù)據(jù)的優(yōu)先級。ITcpAutoSender組件會根據(jù)指定的優(yōu)先級將該數(shù)據(jù)放入到對應(yīng)的隊列中,請注意,將要發(fā)送的數(shù)據(jù)提交給ITcpAutoSender必須是線程安全的,這點已經(jīng)由ITcpAutoSender組件保證,使用者不用關(guān)心。

????ITcpAutoSender內(nèi)部有一個循環(huán)線程,每次從高優(yōu)先級的隊列中選取一個數(shù)據(jù)包進(jìn)行發(fā)送,當(dāng)高優(yōu)先級隊列為空時,再去發(fā)送次高優(yōu)先級隊列中的數(shù)據(jù)。每當(dāng)一個數(shù)據(jù)包發(fā)送完畢,就再從高優(yōu)先級的隊列開始檢查,如此反復(fù)。
??? 從上面的描述已經(jīng)可以看出,ITcpAutoSender組件僅僅是在一個線程中發(fā)送數(shù)據(jù),所以ITcpAutoSender組件不需要再借助ISafeNetworkStream組件,而是直接使用NetworkStream就可以了。那么是不是ESFramework就不需要提供ISafeNetworkStream組件了?不是。在ESFramework框架中,ISafeNetworkStream組件主要用于服務(wù)端,因為通常情況下,服務(wù)端主動發(fā)送數(shù)據(jù)給客戶端的幾率比較小,而且服務(wù)端要管理成千上萬的連接,所以使用ISafeNetworkStream組件是非常合適的。而ITcpAutoSender組件最常用于客戶端,為客戶端應(yīng)用提供發(fā)送的數(shù)據(jù)的優(yōu)先級機制。如果對你的應(yīng)用中的客戶端來說,所有的數(shù)據(jù)的優(yōu)先級是一樣的,那么就沒有必要使用ITcpAutoSender組件了,直接使用ISafeNetworkStream就可以了。
?
??? 在ESFramework框架中,將數(shù)據(jù)的優(yōu)先級分為4等,如下枚舉定義所示:

1???? public?enum?DataPriority
2?????{
3?????????High?,//緊急命令
4?????????Common?,//如普通消息,如聊天消息
5?????????Low?,//如文件傳輸
6?????????CanBeDiscarded?//如視頻數(shù)據(jù)、音頻數(shù)據(jù)
7?????}

??? 對于每個優(yōu)先級,ITcpAutoSender組件的實現(xiàn)中都有一個對應(yīng)的隊列,每個隊列都設(shè)置了初始大小。對于前三個優(yōu)先級隊列,當(dāng)它們Full的時候,應(yīng)用中的線程再提交數(shù)據(jù)就必須阻塞等待。而對于最低優(yōu)先級CanBeDiscarded的隊列,如果Full的時候有數(shù)據(jù)提交過來,則會刪除隊列頭部的待發(fā)送數(shù)據(jù)。下面給出ITcpAutoSender組件的接口定義:
???

?1?????public?interface?ITcpAutoSender?:IDisposable
?2?????{
?3?????????void?Initialize()?;
?4?????????void?SendData(byte[]?data,?DataPriority?dataPriority);??????
?5?????????void?ClearQueue(DataPriority?queueType)?;
?6?????????event?CbDataDiscarded?DataDiscarded;
?7?????????event?CbDataLacked????DataLacked;
?8?????????event?CbSimple????????ConnectionInterrupted?;
?9?
10?????????int?QueueSizeOfDiscarded?{?get;?set;}
11?????????int?QueueSizeOfNonDiscarded?{?get;?set;}
12?????????NetworkStream?NetworkStream?{?set;}
13?????}????
14?
15?????public?delegate?void?CbDataDiscarded(byte[]?data)?;
16?????public?delegate?void?CbDataLacked()?;

??? 注意,這個接口中發(fā)布DataDiscarded事件和DataLacked事件,當(dāng)網(wǎng)絡(luò)繁忙有數(shù)據(jù)被拋棄時,DataDiscarded事件被觸發(fā);當(dāng)所有的待發(fā)送隊列都為空時,DataLacked事件被觸發(fā)。我們的應(yīng)用可以預(yù)定這兩個事件來作些適當(dāng)?shù)恼{(diào)度。比如在AgileIM中,當(dāng)DataDiscarded事件發(fā)生時,就適當(dāng)減少視頻捕獲的幀率;當(dāng)DataLacked事件發(fā)生時,就適當(dāng)增大視頻捕獲的幀率,以達(dá)到更好的視頻會話效果。

??? 最后,說一下,很多朋友想得到ESFramework的源代碼,這要等到ESFramework開源以后,相信這不是很久遠(yuǎn)的事情了。這里,我把ESFramework.dll提供給大家下載適用,當(dāng)然你也可以用反射工具看看其中的構(gòu)造。如果你想在你的項目中使用ESFramework,我將非常樂意回答你遇到的各種問題,你可以通過AgileSoft@163.com聯(lián)系我。
??? 謝謝關(guān)注!

上一篇文章:ESFramework介紹之(15)-- IRAS

轉(zhuǎn)到??:ESFramework 可復(fù)用的通信框架(序)?

?

總結(jié)

以上是生活随笔為你收集整理的ESFramework介绍之(16)―― Tcp数据自动发送器ITcpAutoSender的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。