小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

有了WCF,Socket是否已人老珠黃?

 fatcat916 2012-01-22

有了WCF,Socket是否已人老珠黃?

2010-12-25 16:58 by 田志良, 1802 visits, 收藏, 編輯

1. Socket相關(guān)背景    

  Socket,中文譯為“套接字”,最早在UNIX中引入并得到廣泛應(yīng)用,后來(lái)微軟在設(shè)計(jì)Windows時(shí)引入了UNIX中的這個(gè)概念和相應(yīng)的設(shè)計(jì)理念,并針對(duì)Windows的特性略作調(diào)整,形成了Windows平臺(tái)上的Socket,簡(jiǎn)稱為“WinSock”,并為開發(fā)者提供了一整套的API,稱為“Windows WinSock Win32 API ”。

  WinSock經(jīng)歷了兩個(gè)版本,Windows Sockets 2是目前用得最多的版本(參看 http://en./wiki/Winsock )。     

圖 1所示為.NET平臺(tái)下網(wǎng)絡(luò)應(yīng)用程序的層次架構(gòu):

      圖 1
  WinSock在底層使用一個(gè)運(yùn)行于操作系統(tǒng)核心的系統(tǒng)驅(qū)動(dòng)(Windows Sockets Knernel-mode Driver)tcpip.SYS,由它們負(fù)責(zé)管理網(wǎng)絡(luò)連接和緩沖管理。還有另一個(gè)驅(qū)動(dòng)Afd.sys(Ancillary Function Driver for WinSock)則用于支持基于 window socket的應(yīng)用程序,比如ftp、telnet等,被稱為“ Windows NT 套接字驅(qū)動(dòng)程序 ”。

  早期的Windows開發(fā)者,需要使用C/C++去調(diào)用WinSock,比如MFC就提供了一個(gè)“CSocket”類封裝底層的Socket。.NET也提供了一組類來(lái)封裝WinSock Win32 API,這些類集中于System.Net這一命名空間中,其中的核心類型就是Socket。Socket類是對(duì)WinSock API一個(gè)很淺的封裝,擁有不少方法直接對(duì)應(yīng)于WinSock中的C/C++函數(shù),比如Poll、Select、IOControl等。

  Socket有一個(gè)Handle屬性,它引用位于操作系統(tǒng)核心的Socket核心對(duì)象。Socket提供了眾多的屬性,還提供了SetSocketOption方法來(lái)設(shè)置各種選項(xiàng),對(duì).NET網(wǎng)絡(luò)應(yīng)用程序的數(shù)據(jù)通訊進(jìn)行“微調(diào)”。Socket的功能出奇地強(qiáng)大,在.NET平臺(tái)上,它支持以下四種典型的編程模式:

 ?。?)居于阻塞模式的Socket編程(單線程或多線程的),每個(gè)線程處理一個(gè)客戶端連接 

 ?。?)“非阻塞”模式的Socket編程,這是早期UNIX為提升網(wǎng)絡(luò)應(yīng)用程序性能而采用的編程模式,出于兼容和方便移植原有程序的目的而保留,建議新開發(fā)的.NET網(wǎng)絡(luò)程序不要再使用。

  (3)使用IAsyncResult的異步編程模式:Socket類提供有一堆的“BeginXXX/EndXXX”方法實(shí)現(xiàn)異步Socket編程,使用線程池中的線程完成工作,性能較好。

 ?。?)使用EAP的異步編程模式:Socket類提供了“另一堆”以“Async”結(jié)尾的方法,在底層使用Windows操作系統(tǒng)的Completion Port(完成端口)和Overlapped I/O mechanism(重疊輸入/輸出機(jī)制),可以提供“最高”的性能。


2. 有了WCF,Socket是否已人老珠黃?     

  基于Socket開發(fā)網(wǎng)絡(luò)應(yīng)用程序已經(jīng)有很多年的歷史了,現(xiàn)在的新技術(shù)層出不窮,在.NET平臺(tái)之上,WCF大有“一統(tǒng)江湖”的勢(shì)頭,Socket是否真的“人老珠黃”?    

  請(qǐng)看圖 2所示的多層“松花蛋”:

  
                        圖 2
  圖 2說明,WCF與WinSocket等底層技術(shù)之間實(shí)際上是一種“包含”關(guān)系,每一層都在下一層所提供服務(wù)的基礎(chǔ)上,又?jǐn)U充了新的功能,越外層的應(yīng)用程序,可以使用的功能往往越多,開發(fā)效率往往也會(huì)更高。WCF在WinSocket的基礎(chǔ)之上擴(kuò)充了大量的功能,使用它可以很高效地開發(fā)網(wǎng)絡(luò)應(yīng)用程序,尤其非常適合于開發(fā)基于SOA的分布式軟件系統(tǒng),但這并不是說它可以完全把Socket打入冷宮。在不少場(chǎng)合,拋棄WCF那龐大的框架,直接使用Socket更合適:    

  (1)需要實(shí)現(xiàn)自己的通訊協(xié)議的場(chǎng)合(比如你要架設(shè)一個(gè)網(wǎng)絡(luò)游戲服務(wù)器)。    

  (2)你開發(fā)的系統(tǒng)需要實(shí)現(xiàn)“一問一答”的“交互式”運(yùn)行模式。    

  (3)你希望能全面控制你的網(wǎng)絡(luò)應(yīng)用程序的“每個(gè)方面”,不想花時(shí)間去理解WCF那個(gè)復(fù)雜無(wú)比的內(nèi)部架構(gòu)。    

 ?。?)你的網(wǎng)絡(luò)應(yīng)用程序應(yīng)用背景非常單一與明確,比如就解決一個(gè)問題:定期將分布于多臺(tái)計(jì)算機(jī)上的數(shù)據(jù)文件上傳“匯總”到一臺(tái)中心服務(wù)器上。    

 ?。?)……    

  如果需要基于各種標(biāo)準(zhǔn)協(xié)議(比如WS-*等)開發(fā)SOA的分布式軟件系統(tǒng),再使用Socket就不合適了,那會(huì)大大地增加開發(fā)的工作量和難度,WCF更適合于解決這個(gè)問題。在實(shí)際開發(fā)中,我們還可以混用WCF和Socket。比如我們可以基于WCF開發(fā)P2P的應(yīng)用程序,使用NetPeerTcpBinding在P2P節(jié)點(diǎn)間“廣播消息”,然后,在兩個(gè)P2P節(jié)點(diǎn)之間直接使用Socket“私下”里傳送一個(gè)“秘密”文件。

分類: Socket
標(biāo)簽: socket, WCF
3
1
(請(qǐng)您對(duì)文章做出評(píng)價(jià))
博主前一篇:Http和Socket連接區(qū)別
博主后一篇:Lambda 表達(dá)式 和 Predicate 泛型委托
Add your comment

7 條回復(fù)

  1. #1樓 韋恩卑鄙 v-zhewg @waynebaby      2011-01-06 14:55
    (1)需要實(shí)現(xiàn)自己的通訊協(xié)議的場(chǎng)合(比如你要架設(shè)一個(gè)網(wǎng)絡(luò)游戲服務(wù)器)。
    WCF序列化器你可以自己實(shí)現(xiàn)一個(gè)。
     ?。?)你開發(fā)的系統(tǒng)需要實(shí)現(xiàn)“一問一答”的“交互式”運(yùn)行模式。
    全雙工WCF也不難
     ?。?)你希望能全面控制你的網(wǎng)絡(luò)應(yīng)用程序的“每個(gè)方面”,不想花時(shí)間去理解WCF那個(gè)復(fù)雜無(wú)比的內(nèi)部架構(gòu)。
    往往不想花時(shí)間去理解wcf內(nèi)部結(jié)構(gòu)的人也寫不出什么好的“每個(gè)方面”
     ?。?)你的網(wǎng)絡(luò)應(yīng)用程序應(yīng)用背景非常單一與明確,比如就解決一個(gè)問題:定期將分布于多臺(tái)計(jì)算機(jī)上的數(shù)據(jù)文件上傳“匯總”到一臺(tái)中心服務(wù)器上。

    簡(jiǎn)單也有簡(jiǎn)單的做法,
    .net4的wcf server就可以用http put。
    客戶端嘛。。客戶端當(dāng)然用webrequest
    System.Net.WebClient.UploadFile()就可以了。。。

    socket 能不用,盡量不用。



     回復(fù) 引用 查看   
  2. #2樓[樓主] 田志良      2011-01-06 15:03
    @韋恩卑鄙 v-zhewg @waynebaby
    從效率上將,Socket無(wú)疑是最好的。在很多方面,Socket仍然發(fā)揮了非常重要的作用,比如說,實(shí)現(xiàn)網(wǎng)絡(luò)視頻聊天,客戶端用PHP+Flex,你服務(wù)端用什么通信?WCF?那是不可能實(shí)現(xiàn)的,只能用Socket。
     回復(fù) 引用 查看   
  3. #3樓 韋恩卑鄙 v-zhewg @waynebaby      2011-01-06 15:28
    引用田志良:
    @韋恩卑鄙 v-zhewg @waynebaby
    從效率上將,Socket無(wú)疑是最好的。在很多方面,Socket仍然發(fā)揮了非常重要的作用,比如說,實(shí)現(xiàn)網(wǎng)絡(luò)視頻聊天,客戶端用PHP+Flex,你服務(wù)端用什么通信?WCF?那是不可能實(shí)現(xiàn)的,只能用Socket。



    你一定要用 flex是沒辦法的 ,因?yàn)閒lash是個(gè)土鱉啊
    sl就可以。
    wcf支持打開的流傳播。
    一個(gè)調(diào)用中的參數(shù)可以是一個(gè)IStream,這個(gè)stream eof之前這個(gè)鏈接一直alive,調(diào)用一直不結(jié)束。

    實(shí)現(xiàn)聊天神馬的是如何實(shí)現(xiàn)和管理IStream這一個(gè)問題了
     回復(fù) 引用 查看   
  4. #4樓 韋恩卑鄙 v-zhewg @waynebaby      2011-01-06 15:35
    另外 如果你comet理解得好, 何妨用flash開兩個(gè) Put/Get http流呢?
    restful 的視頻聊天室用WCF實(shí)現(xiàn)
    并不是不可能,只有敢不敢想。
     回復(fù) 引用 查看   
  5. #5樓[樓主] 田志良      2011-01-07 10:49
    @韋恩卑鄙 v-zhewg @waynebaby
    呵呵,看得出來(lái)你對(duì)WCF有很深的理解啊,我最近也在看WCF,以后要向你多多請(qǐng)教啊。最近完成了一個(gè)網(wǎng)絡(luò)視頻聊天項(xiàng)目,那個(gè)項(xiàng)目就是用Socket來(lái)實(shí)現(xiàn)的,Socket效率很高,但開發(fā)周期比較長(zhǎng)。
     回復(fù) 引用 查看   
  6. #6樓 Artech      2011-01-11 22:50
    WCF和Socket其實(shí)沒有太多可比性,應(yīng)用目標(biāo)范圍不同,根本談不上WCF替換Socket的說法。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多