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

分享

Python進(jìn)階記錄之網(wǎng)絡(luò)編程(五)

 豆寶有蟲(chóng)吃 2019-07-12

回顧

在Python進(jìn)階記錄之網(wǎng)絡(luò)編程(四)中,我們介紹了TCP協(xié)議的基本概念以及使用Python創(chuàng)建簡(jiǎn)單的TCP客戶端與TCP服務(wù)端程序。今天我們講一下如何利用TCP server和TCP client實(shí)現(xiàn)簡(jiǎn)單的點(diǎn)對(duì)點(diǎn)聊天。

創(chuàng)建TCP server程序

我們使用socket模塊的socket( )方法創(chuàng)建一個(gè)socket對(duì)象,由于是基于TCP協(xié)議的,所以我們傳入類(lèi)型Type為SOCK_STREAM。無(wú)論是UDP協(xié)議還是TCP協(xié)議,相應(yīng)的服務(wù)端的端口都必須是唯一的,因此我們通過(guò)調(diào)用socket對(duì)象的bind( )方法來(lái)指定服務(wù)端的端口號(hào),同時(shí)指定IP地址為127.0.0.1。

TCP server代碼

通過(guò)上一節(jié)的內(nèi)容,我們知道,TCP server代碼與UDP server代碼非常相似,不同的是,因?yàn)門(mén)CP協(xié)議是面向連接的,所以我們需要使用listen( )方法進(jìn)行監(jiān)聽(tīng),并使用accept( )方法來(lái)獲取連接的客戶端套接字和地址信息。為了可以一直收發(fā)消息,我們使用while循環(huán)。這里我們?nèi)匀恢付ǚ?wù)端首先接收客戶端的消息,因此,我們需要首先接收數(shù)據(jù)。

在基于UDP協(xié)議的UDP服務(wù)端程序中,我們直接使用服務(wù)端套接字的recvfrom( )方法和sendto( )方法來(lái)進(jìn)行消息的接收與發(fā)送,但是在基于TCP協(xié)議的服務(wù)端程序中,我們一般利用accept( )方法獲取的客戶端套接字來(lái)進(jìn)行消息的接收與發(fā)送。recv( )方法獲取消息,send( )方法發(fā)送消息。為了使程序能夠正常終止,我們規(guī)定,當(dāng)接收到“88”的信息時(shí),服務(wù)端程序終止。

創(chuàng)建TCP client程序

創(chuàng)建TCP client程序比服務(wù)端程序要簡(jiǎn)單一點(diǎn),我們?nèi)匀皇褂胹ocket模塊的socket( )方法創(chuàng)建一個(gè)socket對(duì)象,Type設(shè)置為SOCK_STREAM。由于要實(shí)現(xiàn)與我們剛剛創(chuàng)建的TCP服務(wù)端通信,因此設(shè)置要發(fā)送的地址需要指定與剛剛創(chuàng)建的TCP服務(wù)端綁定的地址信息保持一致,IP為“127.0.0.1”,端口號(hào)為“6666”,然后使用connect( )方法進(jìn)行與指定服務(wù)端的連接。

TCP client代碼

同樣地,我們使用while循環(huán)來(lái)保證TCP client程序可以一直收發(fā)消息。前面提到,我們指定服務(wù)端首先接收客戶端的消息,所以客戶端就需要首先發(fā)送消息。當(dāng)發(fā)送的消息為“88”時(shí),客戶端程序終止,同時(shí)服務(wù)端接收到“88”消息后也終止,保證了兩個(gè)程序的正常終止。

運(yùn)行程序

我們之前使用UDP協(xié)議實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)聊天時(shí),由于UDP協(xié)議是一種無(wú)連接的傳輸層協(xié)議,因此無(wú)論先運(yùn)行服務(wù)端程序,還是先運(yùn)行客戶端程序,都是可以正常進(jìn)行通信的。但是TCP協(xié)議是面向連接的,所以必須首先運(yùn)行TCP server程序,啟動(dòng)服務(wù)端后,再運(yùn)行TCP client程序。如果先運(yùn)行TCP client,connect( )方法會(huì)由于找不到指定的服務(wù)而連接失敗。

當(dāng)TCP server和TCP client按順序成功運(yùn)行后,兩者之間就可以進(jìn)行通信了。我們的程序中指定由客戶端首先發(fā)送消息,服務(wù)端接收消息后繼續(xù)發(fā)送消息,直至客戶端發(fā)送消息“88”后兩個(gè)程序終止,程序運(yùn)行結(jié)束。

TCP server運(yùn)行結(jié)果如下所示。

TCP server運(yùn)行結(jié)果

TCP client運(yùn)行結(jié)果如下所示。

TCP client運(yùn)行結(jié)果

至此,我們使用一個(gè)TCP server和一個(gè)TCP client實(shí)現(xiàn)了簡(jiǎn)單的點(diǎn)對(duì)點(diǎn)聊天。與之前基于UDP協(xié)議實(shí)現(xiàn)的點(diǎn)對(duì)點(diǎn)聊天一樣,當(dāng)前的聊天模式只能發(fā)一句收一句,這是因?yàn)槲覀儺?dāng)前的程序都是單線程阻塞的??梢岳梦覀冎敖榻B過(guò)的多進(jìn)程和多線程內(nèi)容,將發(fā)消息和收消息分別使用一個(gè)進(jìn)程來(lái)保證收發(fā)消息互不影響。后續(xù)我們會(huì)介紹多進(jìn)程和多線程的TCP服務(wù)端,到時(shí)候我們?cè)賮?lái)實(shí)現(xiàn)收發(fā)消息互不影響的點(diǎn)對(duì)點(diǎn)聊天。

總結(jié)

以上內(nèi)容介紹了如何利用TCP服務(wù)端和客戶端實(shí)現(xiàn)一個(gè)簡(jiǎn)單的點(diǎn)對(duì)點(diǎn)聊天,需要重點(diǎn)掌握基于TCP協(xié)議的服務(wù)端與客戶端寫(xiě)法,區(qū)別基于UDP協(xié)議的服務(wù)端和客戶端。感謝大家的支持與關(guān)注,歡迎一起學(xué)習(xí)交流~

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(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)論公約

    類(lèi)似文章 更多