網(wǎng)絡(luò)通信3尚學(xué)堂百戰(zhàn)程序員-編程新_第1頁
網(wǎng)絡(luò)通信3尚學(xué)堂百戰(zhàn)程序員-編程新_第2頁
網(wǎng)絡(luò)通信3尚學(xué)堂百戰(zhàn)程序員-編程新_第3頁
網(wǎng)絡(luò)通信3尚學(xué)堂百戰(zhàn)程序員-編程新_第4頁
網(wǎng)絡(luò)通信3尚學(xué)堂百戰(zhàn)程序員-編程新_第5頁
已閱讀5頁,還剩70頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

python-網(wǎng)絡(luò)講師:尚玉杰目錄網(wǎng)絡(luò)基礎(chǔ)socket-udpsocket-tcp網(wǎng)絡(luò)通信過程詳解并發(fā)網(wǎng)絡(luò)服務(wù)器網(wǎng)絡(luò)基礎(chǔ)如何在網(wǎng)絡(luò)中唯一標(biāo)識(shí)一臺(tái)計(jì)算機(jī)?ip地址同一臺(tái)計(jì)算機(jī)上的多個(gè)程序如何共用網(wǎng)絡(luò)而不沖突?網(wǎng)絡(luò)端口不同的計(jì)算機(jī)通信怎么才能互相理解?使用相同的協(xié)議網(wǎng)絡(luò)基礎(chǔ)-IP地址IP地址:?來在?絡(luò)中標(biāo)記?臺(tái)電腦的?串?dāng)?shù)字,?如(c類);在同一?絡(luò)上是惟?的(用來標(biāo)記唯一的一臺(tái)電腦)每?個(gè)IP地址包括兩部分:?絡(luò)地址和主機(jī)地址主機(jī)號(hào)0,255兩個(gè)數(shù)不能使用(網(wǎng)絡(luò)號(hào)、廣播地址)

網(wǎng)絡(luò)基礎(chǔ)-IP地址A類IP地址由1字節(jié)的?絡(luò)地址和3字節(jié)主機(jī)地址組成,?絡(luò)地址的最?位必須是“0”,地址范圍-54可?的A類?絡(luò)有126個(gè),每個(gè)?絡(luò)能容納1677214個(gè)主機(jī)B類IP地址由2個(gè)字節(jié)的?絡(luò)地址和2個(gè)字節(jié)的主機(jī)地址組成,?絡(luò)地址的最?位必須是“10”,地址范圍-54可?的B類?絡(luò)有16384個(gè),每個(gè)?絡(luò)能容納65534主機(jī)C類IP地址由3字節(jié)的?絡(luò)地址和1字節(jié)的主機(jī)地址組成,?絡(luò)地址的最?位必須是“110”范圍-54

C類?絡(luò)可達(dá)2097152個(gè),每個(gè)?絡(luò)能容納254個(gè)主機(jī)D類IP地址第?個(gè)字節(jié)以“1110”開始,它是?個(gè)保留的地址。它并不指向特定的?絡(luò),?前這?類地址被?在多點(diǎn)?播(一對多)中多點(diǎn)?播地址?來?次尋址?組計(jì)算機(jī)地址范圍-54E類IP地址以“1111”開始,為將來使?保留E類地址保留,僅作實(shí)驗(yàn)和開發(fā)?

網(wǎng)絡(luò)基礎(chǔ)-IP地址私有IP:本地局域網(wǎng)上的IP,專門為組織機(jī)構(gòu)內(nèi)部使用在這么多?絡(luò)IP中,國際規(guī)定有?部分IP地址是?于我們的局域?使?,屬于私?IP,不在公?中使?的,它們的范圍是:~55~55~55私有IP:局域網(wǎng)通信,內(nèi)部訪問,不能在外網(wǎng)公用。私有IP禁止出現(xiàn)在Internet中,來自于私有IP的流量全部都會(huì)阻止并丟掉公有IP:全球訪問IP地址127.0.0.1~127.255.255.255?于回路測試測試當(dāng)前計(jì)算機(jī)的網(wǎng)絡(luò)通信協(xié)議如:可以代表本機(jī)IP地址,?就可以測試本機(jī)中配置的Web服務(wù)器常用來ping來看本地ip/tcp正不正常,如能ping通即可正常使用

網(wǎng)絡(luò)基礎(chǔ)-IP地址??掩碼:是我們測量兩個(gè)IP是否屬于同一個(gè)網(wǎng)段的工具??掩碼不能單獨(dú)存在,它必須結(jié)合IP地址?起使???掩碼只有?個(gè)作?,就是將某個(gè)IP地址劃分成?絡(luò)地址和主機(jī)地址兩部分??掩碼的設(shè)定必須遵循?定的規(guī)則:

與IP地址相同,??掩碼的長度也是32位,

左邊是?絡(luò)位,??進(jìn)制數(shù)字“1”表示;

右邊是主機(jī)位,??進(jìn)制數(shù)字“0”表示假設(shè)IP地址為“”??掩碼為“”。

其中,“1”有24個(gè),代表與此相對應(yīng)的IP地址左邊24位是?絡(luò)號(hào);

“0”有8個(gè),代表與此相對應(yīng)的IP地址右邊8位是主機(jī)號(hào)

網(wǎng)絡(luò)基礎(chǔ)-端口號(hào)端口號(hào):用來標(biāo)記區(qū)分進(jìn)程?臺(tái)擁有IP地址的主機(jī)可以提供許多服務(wù),?如HTTP(萬維?服務(wù))、FTP(?件傳輸)、SMTP(電?郵件)等,這些服務(wù)完全可以通過1個(gè)IP地址來實(shí)現(xiàn)。那么,主機(jī)是怎樣區(qū)分不同的?絡(luò)服務(wù)呢?顯然不能只靠IP地址,因?yàn)镮P地址與?絡(luò)服務(wù)的關(guān)系是?對多的關(guān)系。實(shí)際上是通過“IP地址+端?號(hào)”來區(qū)分不同的服務(wù)的。

網(wǎng)絡(luò)基礎(chǔ)-端口號(hào)端?號(hào)是一個(gè)數(shù)字,只有整數(shù),范圍是從0到65535(分為知名和動(dòng)態(tài)兩種)知名端?是眾所周知的端?號(hào)(用來做固定事情),范圍從0到102380端?分配給HTTP服務(wù)(網(wǎng)站)21端?分配給FTP服務(wù)(文件下載)可以理解為,?些常?的功能使?的號(hào)碼是固定的動(dòng)態(tài)端?的范圍是從1024到65535

之所以稱為動(dòng)態(tài)端?,是因?yàn)樗?般不固定分配某種服務(wù),?是動(dòng)態(tài)分配。

動(dòng)態(tài)分配是指當(dāng)?個(gè)系統(tǒng)進(jìn)程或應(yīng)?程序進(jìn)程需要?絡(luò)通信時(shí),它向主機(jī)申

請?個(gè)端?,主機(jī)從可?的端?號(hào)中分配?個(gè)供它使?

網(wǎng)絡(luò)基礎(chǔ)-協(xié)議協(xié)議:約定好的規(guī)范早期的計(jì)算機(jī)?絡(luò),都是由各?商??規(guī)定?套協(xié)議,IBM、Apple和

Microsoft都有各?的?絡(luò)協(xié)議,互不兼容(語言、方言、阿帕網(wǎng))

為了把全世界的所有不同類型的計(jì)算機(jī)都連接起來,就必須規(guī)定?套全球通

?的協(xié)議,為了實(shí)現(xiàn)互聯(lián)?這個(gè)?標(biāo),互聯(lián)?協(xié)議簇(InternetProtocol

Suite)就是通?協(xié)議標(biāo)準(zhǔn)。

因?yàn)榛ヂ?lián)?協(xié)議包含了上百種協(xié)議標(biāo)準(zhǔn),但是最重要的兩個(gè)協(xié)議是TCP和IP

協(xié)議,所以,?家把互聯(lián)?的協(xié)議總稱TCP/IP協(xié)議

(大家都遵循的最基本網(wǎng)絡(luò)通信協(xié)議)是完成進(jìn)程之間通信的規(guī)范

網(wǎng)絡(luò)基礎(chǔ)-協(xié)議根據(jù)TCP/IP協(xié)議簇功能的不同,將它分為了幾種層次(

TCP/IP協(xié)議簇層次劃分)(重點(diǎn)記?。┚W(wǎng)絡(luò)接口層(鏈路層)網(wǎng)絡(luò)層傳輸層應(yīng)用層(寫代碼按四層劃分)物理層數(shù)據(jù)鏈路層網(wǎng)絡(luò)層傳輸層會(huì)話層表示層應(yīng)用層(理論上由七層組成)網(wǎng)絡(luò)基礎(chǔ)-協(xié)議在早期,不同的公司都推出了屬于自己的私有網(wǎng)絡(luò)協(xié)議,相互之間不能兼容于是,ISO(國際標(biāo)準(zhǔn)化組織)站出來:干脆這樣,我給大家制定一個(gè)通用的網(wǎng)絡(luò)通信協(xié)議,該協(xié)議是國際標(biāo)準(zhǔn)于是ISO博覽眾家之長,制訂了“一堆”詳細(xì)的,復(fù)雜的,繁瑣的,精確的網(wǎng)絡(luò)通信協(xié)議不過這堆協(xié)議太復(fù)雜了,為了理清思路,便于學(xué)習(xí),將他們分了7類(也就是分了7層),不同層代表不同的功能,并把這些協(xié)議歸到相應(yīng)的層里面去國際標(biāo)準(zhǔn)出來了,接下來就要軟件/硬件廠商去實(shí)現(xiàn)了。但實(shí)際上各廠商并沒有完整實(shí)現(xiàn)7層協(xié)議,因?yàn)?層協(xié)議棧追求全能、完善,導(dǎo)致它太過復(fù)雜,實(shí)現(xiàn)起來太難了于是,實(shí)際使用時(shí),按4層劃分網(wǎng)絡(luò)基礎(chǔ)-協(xié)議TCP/IP定義了電子設(shè)備如何連入因特網(wǎng),以及數(shù)據(jù)如何在它們之間傳輸?shù)臉?biāo)準(zhǔn)4層的層級(jí)結(jié)構(gòu)中,每一層都呼叫它的下一層所提供的網(wǎng)絡(luò)來完成自己的需求其中的應(yīng)用層關(guān)注的是應(yīng)用程序的細(xì)節(jié),而不是數(shù)據(jù)在網(wǎng)絡(luò)中的傳輸活動(dòng)

其他三層主要處理所有的通信細(xì)節(jié),對應(yīng)用程序一無所知;應(yīng)用層:應(yīng)用程序間溝通的層,不同的文件系統(tǒng)有不同的文件命名原則和不同的文本行表示方法等,不同的系統(tǒng)之間傳輸文件還有各種不兼容問題,這些都將由應(yīng)用層來處理傳輸層:在此層中,它提供了節(jié)點(diǎn)間的數(shù)據(jù)傳送服務(wù),如傳輸控制協(xié)議(TCP)、用戶數(shù)據(jù)報(bào)協(xié)議(UDP)等,這一層負(fù)責(zé)傳送數(shù)據(jù),并且確定數(shù)據(jù)已被送達(dá)并接收網(wǎng)絡(luò)層:負(fù)責(zé)提供基本的數(shù)據(jù)包傳送功能,讓每一塊數(shù)據(jù)包都能夠到達(dá)目的主機(jī)。網(wǎng)絡(luò)層接收由更低層發(fā)來的數(shù)據(jù)包,并把該數(shù)據(jù)包發(fā)送到更高層,相反,IP層也把從TCP或UDP層接收來的數(shù)據(jù)包傳送到更低層網(wǎng)絡(luò)接口層:對實(shí)際的網(wǎng)絡(luò)媒體的管理,定義如何使用實(shí)際網(wǎng)絡(luò)來傳送數(shù)據(jù)(處理機(jī)械的、電氣的和過程的接口)了解即可,面試經(jīng)常會(huì)問網(wǎng)絡(luò)協(xié)議分幾層Socket編程-簡介socket:通過網(wǎng)絡(luò)完成進(jìn)程間通信的方式(區(qū)別于一臺(tái)計(jì)算機(jī)之間進(jìn)程通信)Socket的英文原義是“插孔”。通常也稱作"套接字“Socket編程-簡介Socket本質(zhì)是編程接口(API):Socket

是對TCP/IP協(xié)議的封裝,Socket只是個(gè)編程接口不是協(xié)議,通過Socket我們才能使用TCP/IP協(xié)議簇(程序員層面)TCP/IP也要提供可供程序員做網(wǎng)絡(luò)開發(fā)所用的接口,這就是Socket編程接口;HTTP是轎車,提供了封裝或者顯示數(shù)據(jù)的具體形式;Socket是發(fā)動(dòng)機(jī),提供了網(wǎng)絡(luò)通信的能力最重要的是,Socket是面向客戶/服務(wù)器模型而設(shè)計(jì)的,針對客戶和服務(wù)器程序提供不同的Socket系統(tǒng)調(diào)用套接字之間的連接過程可以分為三個(gè)步驟:服務(wù)器監(jiān)聽,客戶端請求,連接確認(rèn)Socket編程-創(chuàng)建Socket創(chuàng)建Socket:importsocket#導(dǎo)入套接字模塊s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#s此時(shí)是一個(gè)socket對象,擁有發(fā)送和接收網(wǎng)絡(luò)數(shù)據(jù)的功能該函數(shù)帶有兩個(gè)參數(shù)(參數(shù)必須寫)AF_INET(ipv4協(xié)議?于Internet進(jìn)程間通信)套接字類型,可以是SOCK_STREAM(流式套接字,?于

TCP協(xié)議)或者SOCK_DGRAM(數(shù)據(jù)報(bào)套接字,?于UDP協(xié)

議)TCP慢但是穩(wěn)定不會(huì)丟數(shù)據(jù)UDP快但是可能會(huì)丟數(shù)據(jù)(黑客攻擊)確定了IP地址端口號(hào)(ipv4協(xié)議),TCP或UDP協(xié)議之后,計(jì)算機(jī)之間可以進(jìn)行通信

Socket編程-udp和tcpUDPUserDataProtocol,用戶數(shù)據(jù)報(bào)協(xié)議,是?個(gè)?連接的簡單的?向數(shù)據(jù)報(bào)的傳輸層協(xié)議。UDP不提供可靠性,它只是把應(yīng)?程序傳給IP層的數(shù)據(jù)報(bào)發(fā)送出去,但是并不能保證它們能到達(dá)?的地。由于UDP在傳輸數(shù)據(jù)報(bào)前不?在客戶和服務(wù)器之間建??個(gè)連接,且沒有超時(shí)重發(fā)等機(jī)制,故?傳輸速度很快UDP?般?于多點(diǎn)通信和實(shí)時(shí)的數(shù)據(jù)業(yè)務(wù),?如:語??播

視頻

QQ

TFTP(簡單?件傳送)

可以理解為寫信

Socket編程-udp和tcpTCP(TransmissionControlProtocol,傳輸控制協(xié)議)是面向連接的協(xié)議,也就是說,在收發(fā)數(shù)據(jù)前,必須和對方建立可靠的連接一個(gè)TCP連接必須要經(jīng)過三次“對話”才能建立起來,其中的過程非常復(fù)雜,只簡單的描述下這三次對話的簡單過程:主機(jī)A向主機(jī)B發(fā)出連接請求數(shù)據(jù)包:“我想給你發(fā)數(shù)據(jù),可以嗎?”,這是第一次對話主機(jī)B向主機(jī)A發(fā)送同意連接和要求同步(同步就是兩臺(tái)主機(jī)一個(gè)在發(fā)送,一個(gè)在接收,協(xié)調(diào)工作)的數(shù)據(jù)包:“可以,你什么時(shí)候發(fā)?”,這是第二次對話主機(jī)A再發(fā)出一個(gè)數(shù)據(jù)包確認(rèn)主機(jī)B的要求同步:“我現(xiàn)在就發(fā),你接著吧!”,這是第三次對話三次“對話”的目的是使數(shù)據(jù)包的發(fā)送和接收同步,經(jīng)過三次“對話”之后,主機(jī)A才向主機(jī)B正式發(fā)送數(shù)據(jù)可以理解為打電話,先建立通道

Socket編程-udp和tcpTCP與UDP的區(qū)別:1.基于連接與無連接

2.對系統(tǒng)資源的要求(TCP較多,UDP少)

3.UDP程序結(jié)構(gòu)較簡單

4.流模式與數(shù)據(jù)報(bào)模式

5.TCP保證數(shù)據(jù)正確性,UDP可能丟包,TCP保證數(shù)據(jù)順序,UDP不保證

Socket編程-udp編程發(fā)送數(shù)據(jù):為看到效果先安裝“網(wǎng)絡(luò)調(diào)試助手”fromsocketimport*s=socket(AF_INET,SOCK_DGRAM)#創(chuàng)建套接字addr=('7',8080)#準(zhǔn)備接收方地址data=input("請輸入:")s.sendto(data.encode(),addr)#發(fā)送數(shù)據(jù)時(shí),python3需要將字符串轉(zhuǎn)成byte#encode(‘utf-8’)#用utf-8對數(shù)據(jù)進(jìn)行編碼,獲得bytes類型對象#decode()反過來s.close()

Socket編程-udp編程發(fā)送數(shù)據(jù)給飛秋飛秋使用:2425端口發(fā)送普通數(shù)據(jù),飛秋不會(huì)響應(yīng),必須發(fā)送特殊格式的內(nèi)容

1:123123:吳彥祖:吳彥祖-pc:32:haha

飛秋有自己的應(yīng)用層協(xié)議1,表示版本后面的數(shù)字發(fā)送的時(shí)間,隨便寫32代表發(fā)送消息飛秋炸彈:循環(huán)不延時(shí)發(fā)消息(可能會(huì)造成卡死)

注意:IP和端口在網(wǎng)絡(luò)通信中缺一不可,用到的協(xié)議也要匹配,例如飛秋用的是udp協(xié)議,使用TCP協(xié)議發(fā)數(shù)據(jù)是無效的udp理解為寫信(只有收件人地址),TCP理解為打電話(先撥號(hào)建立通路,需要通路穩(wěn)定)

Socket編程-udp編程接收數(shù)據(jù)fromsocketimport*s=socket(AF_INET,SOCK_DGRAM)#創(chuàng)建套接字addr=('7',8080)#準(zhǔn)備接收方地址data=input("請輸入:")s.sendto(data.encode(),addr)#等待接收數(shù)據(jù)redata=s.recvfrom(1024)#1024表示本次接收的最大字節(jié)數(shù)print(redata)s.close()

Socket編程-udp編程綁定信息:

如果信息沒有綁定,每發(fā)送一次信息,系統(tǒng)會(huì)隨機(jī)分配一個(gè)端口還要避免同一臺(tái)計(jì)算機(jī)上的不同進(jìn)程端口號(hào)相同的問題

Socket編程-udp編程綁定信息:讓一個(gè)進(jìn)程可以使用固定的端口一般情況下,發(fā)送方不綁定端口,接收方會(huì)綁定fromsocketimport*s=socket(AF_INET,SOCK_DGRAM)#創(chuàng)建套接字s.bind(('',8788))#綁定一個(gè)端口,ip地址和端?號(hào),ip?般不?寫addr=('7',8080)#準(zhǔn)備接收方地址data=input("請輸入:")s.sendto(data.encode(),addr)redata=s.recvfrom(1024)#1024表示本次接收的最?字節(jié)數(shù)print(redata)s.close()

Socket編程-udp編程echo服務(wù)器:Echo服務(wù)是一種非常有用的用于調(diào)試和檢測的工具。這個(gè)協(xié)議的作用也十分簡單,接收到什么原封發(fā)回fromsocketimport*#1創(chuàng)建套接字udpSocket=socket(AF_INET,SOCK_DGRAM)#2綁定本地信息,不使用隨機(jī)分配的端口bindAddr=("",7088)udpSocket.bind(bindAddr)#綁定num=0

whileTrue:#接收對方發(fā)送的數(shù)據(jù)

recvData=udpSocket.recvfrom(1024)print(recvData)#將接收到的數(shù)據(jù)回發(fā)給對方

udpSocket.sendto(recvData[0],recvData[1])

num+=1print("已將接收到的第%d個(gè)數(shù)據(jù)返回給對方,"%num)udpSocket.close()Socket編程-udp編程聊天室fromsocketimport*importtime#1創(chuàng)建套接字udpSocket=socket(AF_INET,SOCK_DGRAM)bindAddr=("",7088)udpSocket.bind(bindAddr)#綁定whileTrue:#接收對方發(fā)送的數(shù)據(jù)

recvData=udpSocket.recvfrom(1024)print('【%s】%s.%s'%(time.ctime(),recvData[1],recvData[0].decode("GB2312")))a=input("請輸入:")udpSocket.sendto(a.encode('GB2312'),('7',8080))#5關(guān)閉套接字udpSocket.close()

Socket編程-udpudp網(wǎng)絡(luò)通信過程:(類似于發(fā)快遞)1,應(yīng)用層編寫數(shù)據(jù)(你好),然后向下層傳遞

2,傳輸層在數(shù)據(jù)前面加上端口號(hào)(包括發(fā)送端口和目的端口)3,網(wǎng)絡(luò)層繼續(xù)在前面加上IP地址(包括原IP和目的IP)4,鏈路層再在前面加上mac地址(mac:硬件地址,用來定義網(wǎng)絡(luò)設(shè)備的位置)此時(shí)數(shù)據(jù)變成了:mac地址IP地址端口號(hào)數(shù)據(jù)內(nèi)容之后通過網(wǎng)絡(luò)傳輸給另一臺(tái)計(jì)算機(jī)的鏈路層開始逐步解析判斷Socket編程-udp編程練習(xí):使?多線程完成?個(gè)全雙?的聊天程序全雙工(FullDuplex)是通訊傳輸?shù)囊粋€(gè)術(shù)語。通信允許數(shù)據(jù)在兩個(gè)方向上同時(shí)傳輸(電話)單工是只允許甲方向乙方傳送信息,而乙方不能向甲方傳送(收音機(jī))半雙工:甲方發(fā)消息時(shí)乙方只能收不能發(fā)(對講機(jī))

字符集–page29ASCII英文字符集1個(gè)字節(jié)ISO8859-1西歐字符集1個(gè)字節(jié)BIG5臺(tái)灣的大五碼,表示繁體漢字2個(gè)字節(jié)GB2312大陸使用最早、最廣的簡體中文字符集2個(gè)字節(jié)GBKGB2312的擴(kuò)展,可以表示繁體中文2個(gè)字節(jié)GB18030最新GBK的擴(kuò)展,可以表示漢字、維吾爾文、藏文等中華民族字符2個(gè)字節(jié)Unicode國際通用字符集2個(gè)字節(jié)wireshark安裝和使用wireshark是一個(gè)網(wǎng)絡(luò)抓包軟件:所有流經(jīng)本電腦的數(shù)據(jù)(不論收發(fā)),都可以獲取(win系統(tǒng)安裝時(shí)如果出現(xiàn)無法定位輸入點(diǎn)。。。需要安裝winpcap)No顯示序號(hào):表示已經(jīng)抓到了多少個(gè)數(shù)據(jù)包time:表示抓到數(shù)據(jù)包所經(jīng)過的時(shí)間sourct:源IP,destination:目的IP,protocol:使用的協(xié)議length:數(shù)據(jù)包的長度(字節(jié))info:wireshark對這個(gè)數(shù)據(jù)包的理解wireshark安裝和使用過濾規(guī)則1.過濾IP,如來源IP或者目標(biāo)IP等于某個(gè)IP例子:查找目的地址為的包ip.dst==查找源地址ip.src==

ip.src

eq

07

or

ip.dst

eq

07

或者ip.addr

eq

07

都能顯示來源IP和目標(biāo)IPwireshark安裝和使用過濾規(guī)則2.過濾端口例子:tcp.port

eq

80

//

不管端口是來源的還是目標(biāo)的都顯示tcp.port

==

80tcp.port

eq

80

or

udp.port

eq

80tcp.dstport

==

80

//

只顯tcp協(xié)議的目標(biāo)端口80tcp.srcport

==

80

//

只顯tcp協(xié)議的來源端口80udp.port

eq

15000wireshark安裝和使用過濾規(guī)則3.過濾協(xié)議:直接輸入?yún)f(xié)議名例子:tcpudparpicmphttpTFTP介紹TFTP(TrivialFileTransferProtocol,簡單?件傳輸協(xié)議)是TCP/IP協(xié)議簇中的?個(gè)?來在客戶端與服務(wù)器之間進(jìn)?簡單?件傳輸?shù)膮f(xié)議使用tftp這個(gè)協(xié)議,就可以實(shí)現(xiàn)簡單文件的下載特點(diǎn):簡單

占?資源?

適合傳遞??件

適合在局域?進(jìn)?傳遞

端?號(hào)為69

基于UDP實(shí)現(xiàn)

TFTP介紹Tftpd32:共享服務(wù)器(可以從本機(jī)共享文件)

browse:選擇一個(gè)文件夾,確定給客戶端文件時(shí)的搜索路徑客戶端:數(shù)據(jù)接收方服務(wù)器:數(shù)據(jù)發(fā)送方

確定文件分享的路徑TFTP介紹有了服務(wù)器之后,還需要編寫一個(gè)下載器(客戶端)實(shí)現(xiàn)TFTP下載器:下載:從服務(wù)器上將一個(gè)文件復(fù)制到本機(jī)上下載的過程:在本地創(chuàng)建一個(gè)空文件(與要下載的文件同名)向里面寫數(shù)據(jù)(接收到一點(diǎn)就向空文件里寫一點(diǎn))關(guān)閉(接受完所有數(shù)據(jù)關(guān)閉文件)

TFTP介紹

服務(wù)器查找是否有該文件告訴服務(wù)器是否收到隨機(jī)端口注意:服務(wù)器的69端口只用來接收讀寫請求,ack包不要發(fā)到69端口TFTP格式要求

1下載

2上傳octet

傳輸格式固定每次發(fā)送文件中的512個(gè)字節(jié)確認(rèn)包TFTP介紹當(dāng)客戶端接收到的數(shù)據(jù)?于516(2字節(jié)操作碼+2個(gè)字節(jié)的序號(hào)+512字節(jié)數(shù)據(jù))時(shí),就意味著服務(wù)器發(fā)送完畢了(如果恰好最后一次數(shù)據(jù)長度為516,會(huì)再發(fā)一個(gè)長度為0的數(shù)據(jù)包)構(gòu)造下載請求數(shù)據(jù):“1test.jpg0octet0”importstructcmb_buf=struct.pack(“!H8sb5sb”,1,b“test.jpg”,0,b“octet”,0)

如何保證操作碼(1/2/3/4/5)占兩個(gè)字節(jié)?如何保證0占一個(gè)字節(jié)?

#!H8sb5sb:!表示按照網(wǎng)絡(luò)傳輸數(shù)據(jù)要求的形式來組織數(shù)據(jù)(占位的格式)

H表示將后面的1替換成占兩個(gè)字節(jié)

8s相當(dāng)于8個(gè)s(ssssssss)占8個(gè)字節(jié)

b占一個(gè)字節(jié)

struct模塊使用struct模塊可以按照指定格式將Python數(shù)據(jù)轉(zhuǎn)換為字符串,該字符串為字節(jié)流struct模塊中最重要的三個(gè)函數(shù)是pack(),unpack(),calcsize()#按照給定的格式(fmt),把數(shù)據(jù)封裝成字符串(實(shí)際上是類似于c結(jié)構(gòu)體的字節(jié)流)

pack(fmt,v1,v2,...)

#按照給定的格式(fmt)解析字節(jié)流string,返回解析出來的元組

unpack(fmt,string)

#計(jì)算給定的格式(fmt)占用多少字節(jié)的內(nèi)存

calcsize(fmt)struct.pack(“!H8sb5sb”,1,“test.jpg”,0,“octet”,0)struct.pack("!HH",4,p_num)cmdTuple=struct.unpack("!HH",recvData[:4])struct模塊使用FORMATCTYPEPYTHONTYPESTANDARDSIZExpadbytenovalueccharstringoflength11bsignedcharinteger1Bunsignedcharinteger1?_Boolbool1hshortinteger2Hunsignedshortinteger2iintinteger4Iunsignedintinteger4llonginteger4Lunsignedlonginteger4qlonglonginteger8Qunsignedlonglonginteger8ffloatfloat4ddoublefloat8schar[]stringpchar[]stringPvoid*integerq和Q只適用于64位機(jī)器;每個(gè)格式前可以有一個(gè)數(shù)字,表示這個(gè)類型的個(gè)數(shù),如s格式表示一定長度的字符串,4s表示長度為4的字符串struct模塊使用向服務(wù)器發(fā)送請求:importstructfromsocketimport*cmb_buf=struct.pack("!H9sb5sb",1,b"test1.jpg",0,b"octet",0)udpSocket=socket(AF_INET,SOCK_DGRAM)udpSocket.sendto(cmb_buf,("",69))udpSocket.close()

向其他電腦發(fā)送這個(gè)請求,查看是否能抓到這個(gè)數(shù)據(jù)包(udp.port==69,tftp)TFTP客戶端編程importstructfromsocketimport*filename='test1.jpg'server_ip=''send_data=struct.pack('!H%dsb5sb'%len(filename),1,filename.encode(),0,'octet'.encode(),0)s=socket(AF_INET,SOCK_DGRAM)s.sendto(send_data,(server_ip,69))#第一次發(fā)送,連接服務(wù)器69端口f=open(filename,'ab')#a:以追加模式打開(必要時(shí)可以創(chuàng)建)append;b:表示二進(jìn)制whileTrue:recv_data=s.recvfrom(1024)#接收數(shù)據(jù)

caozuoma,ack_num=struct.unpack('!HH',recv_data[0][:4])#獲取數(shù)據(jù)塊編號(hào)

rand_port=recv_data[1][1]#獲取服務(wù)器的隨機(jī)端口

ifint(caozuoma)==5:print('文件不存在...')breakprint("操作碼:%d,ACK:%d,服務(wù)器隨機(jī)端口:%d,數(shù)據(jù)長度:%d"%(caozuoma,ack_num,rand_port,len(recv_data[0])))f.write(recv_data[0][4:])#將數(shù)據(jù)寫入

iflen(recv_data[0])<516:breakack_data=struct.pack("!HH",4,ack_num)s.sendto(ack_data,(server_ip,rand_port))#回復(fù)ACK確認(rèn)包udp廣播udp廣播:當(dāng)前網(wǎng)絡(luò)上所有電腦

的某個(gè)進(jìn)程都收到同一個(gè)數(shù)據(jù)(tcp沒有廣播)

單播:點(diǎn)對點(diǎn)多播:一對多廣播:一對所有接收方

(飛秋知道有人上線了?誰在線?IP地址分配)廣播方交換機(jī)接收方2接收方3接收方4接收方5接收方1數(shù)據(jù)如果讓廣播方給接收方每人發(fā)一份數(shù)據(jù),將會(huì)出現(xiàn)卡頓。所以借助交換機(jī)來分發(fā)數(shù)據(jù)交換機(jī)如果接收到廣播地址udp廣播importsocketdest=(‘<broadcast>’,7788)

#<broadcast>自動(dòng)識(shí)別當(dāng)前網(wǎng)絡(luò)的廣播地址#創(chuàng)建udp套接字s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#對這個(gè)需要發(fā)送廣播數(shù)據(jù)的套接字進(jìn)行修改設(shè)置,否則不能發(fā)送廣播數(shù)據(jù)s.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)#允許s發(fā)送廣播數(shù)據(jù)#setsocketopt設(shè)置套接字選項(xiàng)#以廣播形式發(fā)送數(shù)據(jù)到本網(wǎng)絡(luò)的所有電腦中s.sendto(b'Hi',dest)print("等待回復(fù)")whileTrue:(buf,address)=s.recvfrom(2048)print(address,buf.decode(“GB2312”))

PacketTracer介紹&安裝

PacketTracer是由Cisco(思科)公司發(fā)布的?個(gè)輔助學(xué)習(xí)?具,為學(xué)習(xí)思科?絡(luò)課程的初學(xué)者去設(shè)計(jì)、配置、排除?絡(luò)故障提供了?絡(luò)模擬環(huán)境(不用買硬件)可以提供數(shù)據(jù)包在網(wǎng)絡(luò)中行進(jìn)的詳細(xì)處理過程

觀察網(wǎng)絡(luò)實(shí)時(shí)運(yùn)行情況

(輔助學(xué)習(xí)網(wǎng)絡(luò)通信過程)2臺(tái)電腦連網(wǎng)添加兩臺(tái)電腦連接設(shè)置網(wǎng)絡(luò)ping2臺(tái)電腦連網(wǎng)單擊終端設(shè)備,分別設(shè)置兩臺(tái)終端的IP和子網(wǎng)掩碼子網(wǎng)掩碼:與IP成對出現(xiàn),進(jìn)行按位與操作后可以得到當(dāng)前的網(wǎng)絡(luò)號(hào)(哪類IP)2臺(tái)電腦連網(wǎng)再單擊其中一臺(tái)終端,嘗試IP地址能否ping通

(換一個(gè)網(wǎng)段還能否ping通?)通過集線器連網(wǎng)添加三臺(tái)電腦添加集線器

(為什么不能連到之前的通路上?)連網(wǎng)設(shè)置網(wǎng)絡(luò)ping集線器類似于USB擴(kuò)展口:用來鏈接多臺(tái)電腦通過交換機(jī)連網(wǎng)集線器(HUB)是計(jì)算機(jī)網(wǎng)絡(luò)中連接多個(gè)計(jì)算機(jī)或其他設(shè)備的連接設(shè)備,是對網(wǎng)絡(luò)進(jìn)行集中管理的最小單元。英文Hub就是中心的意思,像樹的主干一樣,它是各分支的匯集點(diǎn)。HUB是一個(gè)共享設(shè)備,主要提供信號(hào)放大和中轉(zhuǎn)的功能,它把一個(gè)端口接收的所有信號(hào)向所有端口分發(fā)出去交換機(jī)(Switch)是一種基于MAC(網(wǎng)卡的硬件地址)識(shí)別,能完成封裝轉(zhuǎn)發(fā)數(shù)據(jù)包功能的網(wǎng)絡(luò)設(shè)備。交換機(jī)可以“學(xué)習(xí)”MAC地址,并把其存放在內(nèi)部地址表中,通過在數(shù)據(jù)幀的始發(fā)者和目標(biāo)接收者之間建立臨時(shí)的交換路徑,使數(shù)據(jù)幀直接由源地址到達(dá)目的地址

通過交換機(jī)連網(wǎng)例如一個(gè)8口hub,當(dāng)端口1上的機(jī)器要給端口8上的機(jī)器發(fā)數(shù)據(jù)端口1上hub上有沒有數(shù)據(jù)在傳輸,如果沒有,端口1就跳出來向hub上喊:“我有數(shù)據(jù)包要給端口8,請端口8聽到后回話”這個(gè)數(shù)據(jù)被以廣播的方式發(fā)送到hub上的其余7個(gè)口上,每端口都會(huì)接到這樣的數(shù)據(jù)包,然后端口2---端口7會(huì)發(fā)一則消息給1:“我不是端口8”與此同時(shí)端口8會(huì)發(fā)消息給1:“我是端口8,找我嗎?”端口1收到上述消息后,會(huì)和端口8進(jìn)行確認(rèn),然后他們建立傳輸鏈接,完成數(shù)據(jù)轉(zhuǎn)發(fā)。等如果端口1在發(fā)送尋找斷口8的消息后,沒有得到相應(yīng),那它還會(huì)接著發(fā)這個(gè)消息,直到收到端口8的回答。等端口1和端口8完整數(shù)據(jù)轉(zhuǎn)發(fā)后,假設(shè)他們還要進(jìn)行通訊,那么hub上還會(huì)重復(fù)以上的過程一個(gè)數(shù)據(jù),需要送達(dá)所有的端口,這不但增加了數(shù)據(jù)轉(zhuǎn)發(fā)的時(shí)間,而且hub往往會(huì)給網(wǎng)絡(luò)帶來廣播風(fēng)暴(廣播數(shù)據(jù)充斥網(wǎng)絡(luò)無法處理,并占用大量網(wǎng)絡(luò)帶寬,導(dǎo)致正常業(yè)務(wù)不能運(yùn)行)通過交換機(jī)連網(wǎng)相同的工作交換機(jī)就不用這么麻煩假設(shè)端口1和端口8從沒有通信過,那么開始的時(shí)候,他們的工作和hub一樣,端口1要在交換機(jī)上找端口8,一旦端口8返回確認(rèn)信息,那再端口1上就會(huì)生成1個(gè)和端口8的地址對應(yīng)表這個(gè)表里面有所有和端口1通過信的端口,一旦有了這地址對應(yīng)表,那在以后端口1要和端口8通訊,可以直接送達(dá),而且其他的端口也不會(huì)知道他們之間正在轉(zhuǎn)發(fā)數(shù)據(jù),這樣加快了數(shù)據(jù)轉(zhuǎn)發(fā)時(shí)間,并且避免了廣播風(fēng)暴

(ping之后點(diǎn)模擬測試以上規(guī)則)通過路由器連網(wǎng)兩臺(tái)電腦之間能通信的前提是什么?在同一網(wǎng)段多臺(tái)電腦之間為什么不能把網(wǎng)線剪開連在一起?數(shù)據(jù)是通過電信號(hào)來傳輸?shù)?,多個(gè)電信號(hào)同時(shí)傳輸會(huì)出錯(cuò)集線器hub有什么作用?鏈接多臺(tái)電腦組成小型局域網(wǎng)集線器和交換機(jī)的區(qū)別?集線器收到的所有數(shù)據(jù)包都會(huì)以廣播形式發(fā)送交換機(jī)可以智能學(xué)習(xí),如果已經(jīng)通信過的設(shè)備之間,可以直接通信通過路由器連網(wǎng)物理地址(實(shí)際地址):由網(wǎng)絡(luò)設(shè)備制造商生產(chǎn)時(shí)寫在硬件內(nèi)部IP地址與MAC地址在計(jì)算機(jī)里都是以二進(jìn)制表示的,IP地址是32位的,而MAC地址則是48位的(6個(gè)字節(jié))如:08:00:20:0A:8C:6D就是一個(gè)MAC地址,其中前3組16進(jìn)制數(shù)08:00:20代表網(wǎng)絡(luò)硬件制造商的編號(hào),它由IEEE(電氣與電子工程師協(xié)會(huì))分配而后3組16進(jìn)制數(shù)0A:8C:6D代表該制造商所制造的某個(gè)網(wǎng)絡(luò)產(chǎn)品(如網(wǎng)卡)的系列號(hào)MAC地址在世界是惟一的(可以直接理解為網(wǎng)卡的序列號(hào))通過IP地址、端口號(hào)、MAC地址保證了數(shù)據(jù)的穩(wěn)定傳輸通過路由器連網(wǎng)路由器:確定一條路徑的設(shè)備,路由器是連接因特網(wǎng)中用來鏈接網(wǎng)絡(luò)號(hào)不同的、不同的網(wǎng)絡(luò),相當(dāng)于中間人各局域網(wǎng)、廣域網(wǎng)的設(shè)備,它會(huì)根據(jù)信道的情況自動(dòng)選擇和設(shè)定路由,以最佳路徑,按前后順序發(fā)送信號(hào)的設(shè)備。路由器的一個(gè)作用是連通不同的網(wǎng)絡(luò),另一個(gè)作用是選擇信息傳送的線路選擇通暢快捷的近路,能大大提高通信速度,減輕網(wǎng)絡(luò)系統(tǒng)通信負(fù)荷,節(jié)約網(wǎng)絡(luò)系統(tǒng)資源,提高網(wǎng)絡(luò)系統(tǒng)暢通率(舉例:怎么去柏林)通過路由器連網(wǎng)終端終端終端終端終端終端交換機(jī)交換機(jī)路由器網(wǎng)卡網(wǎng)卡同一個(gè)局域網(wǎng)當(dāng)中的終端之間進(jìn)行通訊的基礎(chǔ)是處于同一個(gè)網(wǎng)段中,一個(gè)路由器至少有兩個(gè)網(wǎng)卡,能夠鏈接不同網(wǎng)段的網(wǎng)絡(luò)使之可以通信(了解即可)192.168.1.X192.168.2.XTCP網(wǎng)絡(luò)通信的方式:TCP、UDPTCP:傳輸控制協(xié)議(使用情況多于udp)

穩(wěn)定:保證數(shù)據(jù)一定能收到

相對UDP會(huì)慢一點(diǎn)

web服務(wù)器一般都使用TCP(銀行轉(zhuǎn)賬,穩(wěn)定比快要重要)

TCP通信模型:

在通信之前,必須先等待建立鏈接

TCP

設(shè)置最大連接數(shù)等待接受socket連接連接、撥打TCP的三次握手第一次握手:建立連接時(shí),客戶端發(fā)送SYN(請求同步)包到服務(wù)器,并進(jìn)入SYN_SENT(請求連接)狀態(tài),等待服務(wù)器確認(rèn)第二次握手:服務(wù)器收到syn包,必須確認(rèn)客戶的SYN(x+1),同時(shí)自己也發(fā)送一個(gè)SYN包(syn=y),即SYN+ACK包,此時(shí)服務(wù)器進(jìn)入SYN_RECV(SYN派遣)狀態(tài)

第三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(y+1),此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入ESTABLISHED(TCP連接成功)狀態(tài),完成三次握手??蛻舳伺c服務(wù)器才正式開始傳送數(shù)據(jù)理想狀態(tài)下,TCP連接一旦建立,在通信雙方中的任何一方主動(dòng)關(guān)閉連接之前,TCP

連接都將被一直保持下去SYN:請求同步ACK:確認(rèn)同步TCP服務(wù)器在tcp傳輸過程中,如果有一方收到了對方的數(shù)據(jù),一定會(huì)發(fā)送一個(gè)ACK確認(rèn)包給發(fā)送方

TCP的四次揮手?jǐn)嚅_一個(gè)TCP連接則需要“四次揮手”第一次揮手:主動(dòng)關(guān)閉方調(diào)用close,會(huì)發(fā)送一個(gè)長度為0的數(shù)據(jù)包以及FIN(結(jié)束標(biāo)志)用來關(guān)閉主動(dòng)方到被動(dòng)關(guān)閉方的數(shù)據(jù)傳送,告訴被動(dòng)關(guān)閉方:我已經(jīng)不會(huì)再給你發(fā)數(shù)據(jù)了,但是,此時(shí)主動(dòng)關(guān)閉方還可以接受數(shù)據(jù)第二次揮手:被動(dòng)關(guān)閉方收到FIN包后,發(fā)送一個(gè)ACK給對方,確認(rèn)序號(hào)為收到序號(hào)+1

第三次揮手:被動(dòng)關(guān)閉方發(fā)送一個(gè)FIN,用來關(guān)閉被動(dòng)關(guān)閉方到主動(dòng)關(guān)閉方的數(shù)據(jù)傳送,也就是告訴主動(dòng)關(guān)閉方,我的數(shù)據(jù)也發(fā)送完了,不會(huì)再給你發(fā)數(shù)據(jù)了。

第四次揮手:主動(dòng)關(guān)閉方收到FIN后,發(fā)送一個(gè)ACK給被動(dòng)關(guān)閉方,確認(rèn)序號(hào)為收到序號(hào)+1,至此,完成四次揮手TCP服務(wù)器長連接:三次握手四次揮手之間分多次傳遞完所有數(shù)據(jù)(優(yōu)酷看視頻、在線游戲),長時(shí)間占用某個(gè)套接字短連接:三次握手四次揮手之間傳遞少部分?jǐn)?shù)據(jù),多次握手揮手才傳遞完所有數(shù)據(jù)

(瀏覽器),短時(shí)間占用tcp服務(wù)器流程如下:

1.socket創(chuàng)建?個(gè)套接字

2.bind綁定ip和port

3.listen設(shè)置最大連接數(shù),收到連接請求后,這些請求需要排隊(duì),如果隊(duì)列滿,就拒絕請求

4.accept等待客戶端的鏈接、接收連接請求

5.recv/send接收發(fā)送數(shù)據(jù)

TCP服務(wù)器fromsocketimport*

tcpSerSocket=socket(AF_INET,SOCK_STREAM)

address=(‘’,7788)

tcpSerSocket.bind(address)

tcpSerSocket.listen(5)#設(shè)置最大連接數(shù)newSocket,clientAddr=tcpSerSocket.accept()

#如果有新的客戶端來鏈接服務(wù)器,那么就產(chǎn)??個(gè)新的套接字

#newSocket?來為這個(gè)客戶端服務(wù)(10086小妹)

#tcpSerSocket就可以省下來等待其他新客戶端的鏈接

#接收對?發(fā)送過來的數(shù)據(jù),最?接收1024個(gè)字節(jié)

recvData=newSocket.recv(1024)

#接收tcp數(shù)據(jù)

#發(fā)送?些數(shù)據(jù)到客戶端

newSocket.send(“thankyou!”)#發(fā)送tcp數(shù)據(jù)

#關(guān)閉為這個(gè)客戶端服務(wù)的套接字,只要關(guān)閉了,就意味著為不能再為這個(gè)客戶端服務(wù)了

newSocket.close()

#關(guān)閉監(jiān)聽套接字,只要這個(gè)套接字關(guān)閉了,就意味著整個(gè)程序不能再接收任何新的客戶端的連接

tcpSerSocket.close()使用網(wǎng)絡(luò)調(diào)試助手測試代碼

TCP客戶端fromsocketimport*clientSocket=socket(AF_INET,SOCK_STREAM)serAddr=('7',7788)#鏈接服務(wù)器clientSocket.connect(serAddr)clientSocket.send(b"hello")recvData=clientSocket.recv(1024)print("接收到的數(shù)據(jù)為:",recvData)clientSocket.close()

單進(jìn)程服務(wù)器(每次只能服務(wù)一個(gè)客戶端)fromsocketimport*serSocket=socket(AF_INET,SOCK_STREAM)localAddr=('',7788)serSocket.bind(localAddr)serSocket.listen(5)whileTrue:print("主進(jìn)程等待新客戶端")newSocket,destAddr=serSocket.accept()print("主進(jìn)程接下來負(fù)責(zé)處理",str(destAddr))try:whileTrue:recvData=newSocket.recv(1024)iflen(recvData)>0:#如果收到的客戶端數(shù)據(jù)長度為0,代表客戶端已經(jīng)調(diào)用close()下線print("接收到",str(destAddr),recvData)else:print("%s-客戶端已關(guān)閉"%str(destAddr))breakfinally:newSocket.close()serSocket.close()

并發(fā)服務(wù)器serSocket.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)

重新設(shè)置套接字選項(xiàng),重復(fù)使用綁定的信息#當(dāng)有一個(gè)有相同本地地址和端口的socket1處于TIME_WAIT狀態(tài)時(shí),而你啟動(dòng)的程序的socket2要占用該地址和端口,你的程序就要用到SO_REUSEADDR選項(xiàng)。

多進(jìn)程服務(wù)器(同時(shí)為多個(gè)客戶端服務(wù))fromsocketimport*

frommultiprocessingimport*

fromtimeimportsleep

#處理客戶端的請求并為其服務(wù)

defdealWithClient(newSocket,destAddr):

whileTrue:

recvData=newSocket.recv(1024)

iflen(recvData)>0:

print('recv[%s]:%s'%(str(destAddr),recvData))

else:

print('[%s]客戶端已經(jīng)關(guān)閉'%str(destAddr))

break

newSocket.close()

defmain():

serSocket=socket(AF_INET,SOCK_STREAM)

serSocket.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)

localAddr=('',7788)

serSocket.bind(localAddr)

serSocket.listen(5)

try:

whileTrue:

print('主進(jìn)程,,等待新客戶端的到來’)

newSocket,destAddr=serSocket.accept()print(‘主進(jìn)程,,接下來創(chuàng)建?個(gè)新的進(jìn)程負(fù)責(zé)數(shù)據(jù)處理’)

client=Process(target=dealWithClient,args=(newSocket,destAddr))

client.start()

#因?yàn)橐呀?jīng)向?進(jìn)程中copy了?份(引?),

并且?進(jìn)程中這個(gè)套接字也沒有用處了

#所以關(guān)閉

newSocket.close()

finally:

#當(dāng)為所有的客戶端服務(wù)完之后再進(jìn)?關(guān)閉,

表示不再接收新的客戶端的鏈接

serSocket.close()

if__name__=='__main__’:

main()

多線程服務(wù)器(耗費(fèi)的資源比多進(jìn)程小一些)fromsocketimport*

fromthreadingimportThread

fromtimeimportsleep

#處理客戶端的請求并執(zhí)?事情

defdealWithClient(newSocket,destAddr):

whileTrue:

recvData=newSocket.recv(1024)

iflen(recvData)>0:

print('recv[%s]:%s'%(str(destAddr),recvData))

else:

print('[%s]客戶端已經(jīng)關(guān)閉'%str(destAddr))

break

newSocket.close()

defmain():

serSocket=socket(AF_INET,SOCK_STREAM)

serSocket.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)

localAddr=('',7788)

serSocket.bind(localAddr)

serSocket.listen(5)

多線程服務(wù)器(耗費(fèi)的資源比多進(jìn)程小一些)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論