国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

ELEOK

標(biāo)題: C# Socket編程筆記 [打印本頁]

作者: psetpsetpset    時(shí)間: 2014-8-12 09:08
標(biāo)題: C# Socket編程筆記
本帖最后由 psetpsetpset 于 2014-8-12 09:31 編輯

       看到這個(gè)題目,是不是很眼熟?在博客園里搜下,保證會發(fā)現(xiàn)關(guān)于這個(gè)東東的文章實(shí)在是太多了~~~真得是沒有寫得必要,而且我也有點(diǎn)懶得去琢磨字句。(看到這,肯定得來個(gè)轉(zhuǎn)折的了,不然就看不到下文了,不是嗎)但是,為了自己下一篇要寫的文章做參考,還是有必要先補(bǔ)充一下socket基礎(chǔ)知識。

      注意:如果你已經(jīng)接觸過socket,那就沒什么必要耽誤時(shí)間看下去了。另外,如果發(fā)現(xiàn)其中任何錯(cuò)誤,歡迎直接指出。

      1.按慣例先來介紹下socket
      Windows中的很多東西都是從Unix領(lǐng)域借鑒過來的,Socket也是一樣。在Unix中,socket代表了一種文件描述符(在Unix中一切都是以文件為單位),而這里這個(gè)描述符則是用于描述網(wǎng)絡(luò)訪問的。什么意思呢?就是程序員可以通過socket來發(fā)送和接收網(wǎng)絡(luò)上的數(shù)據(jù)。你也可以理解成是一個(gè)API。有了它,你就不用直接去操作網(wǎng)卡了,而是通過這個(gè)接口,這樣就省了很多復(fù)雜的操作。
      在C#中,MS為我們提供了 System.Net.Sockets 命名空間,里面包含了Socket類。

      2.有了socket,那就可以用它來訪問網(wǎng)絡(luò)了
      不過你不要高興得太早,要想訪問網(wǎng)絡(luò),還得有些基本的條件(和編程無關(guān)的我就不提了):a. 要確定本機(jī)的IP和端口,socket只有與某一IP和端口綁定,才能發(fā)揮強(qiáng)大的威力。b. 得有協(xié)議吧(否則誰認(rèn)得你這發(fā)送到網(wǎng)絡(luò)的是什么呀)。想要復(fù)雜的,我們可以自己來定協(xié)議。但是這個(gè)就不在這篇里提了,我這里介紹兩種大家最熟悉不過的協(xié)議:TCP & UDP。(別說你不知道,不然...不然...我不告訴你)
      如果具備了基本的條件,就可以開始用它們訪問網(wǎng)絡(luò)了。來看看步驟吧:
      a. 建立一個(gè)套接字
      b. 綁定本機(jī)的IP和端口
      c. 如果是TCP,因?yàn)槭敲嫦蜻B接的,所以要利用ListenO()方法來監(jiān)聽網(wǎng)絡(luò)上是否有人給自己發(fā)東西;如果是UDP,因?yàn)槭菬o連接的,所以來者不拒。
      d. TCP情況下,如果監(jiān)聽到一個(gè)連接,就可以使用accept來接收這個(gè)連接,然后就可以利用Send/Receive來執(zhí)行操作了。而UDP,則不需要accept, 直接使用SendTo/ReceiveFrom來執(zhí)行操作。(看清楚哦,和TCP的執(zhí)行方法有區(qū)別,因?yàn)閁DP不需要建立連接,所以在發(fā)送前并不知道對方的IP和端口,因此需要指定一個(gè)發(fā)送的節(jié)點(diǎn)才能進(jìn)行正常的發(fā)送和接收)
      e. 如果你不想繼續(xù)發(fā)送和接收了,就不要浪費(fèi)資源了。能close的就close吧。


      3.開始動手敲~~代碼(簡單的代碼)
      首先我們來寫個(gè)面向連接的
TCPServer
復(fù)制代碼
TCPClient
復(fù)制代碼
下面在給出無連接的(實(shí)在是太懶了,下面這個(gè)是直接復(fù)制別人的)
UDPServer
復(fù)制代碼
UDPClient

上面的示例只是簡單的應(yīng)用了socket來實(shí)現(xiàn)通信,你也可以實(shí)現(xiàn)異步socket、IP組播 等等。

    MS還為我們提供了幾個(gè)助手類:TcpClient類、TcpListener類、UDPClient類。這幾個(gè)類簡化了一些操作,所以你也可以利用這幾類來寫上面的代碼,但我個(gè)人還是比較習(xí)慣直接用socket來寫。
      
      既然快寫完了,那我就再多啰嗦幾句。在需要即時(shí)響應(yīng)的軟件中,我個(gè)人更傾向使用UDP來實(shí)現(xiàn)通信,因?yàn)橄啾萒CP來說,UDP占用更少的資源,且響應(yīng)速度快,延時(shí)低。至于UDP的可靠性,則可以通過在應(yīng)用層加以控制來滿足。當(dāng)然如果可靠性要求高的環(huán)境下,還是建議使用TCP。
作者: smirkboy    時(shí)間: 2014-8-19 21:44
感謝你 的說明..:D
作者: 工控光腳    時(shí)間: 2015-5-29 17:18
歡迎常來發(fā)表文章,:lol:lol:lol




歡迎光臨 ELEOK (http://m.afoofa.cn/) Powered by Discuz! X5.0