不管你是待業(yè)還是失業(yè),在這個(gè)被互聯(lián)網(wǎng)圍繞的時(shí)代里,選擇python網(wǎng)絡(luò)編程,就多了一項(xiàng)技能,還怕找不到工作?,還怕不好找工作?小編就來告訴你這個(gè)專業(yè)的優(yōu)勢到底體現(xiàn)在哪里:Python 中的網(wǎng)絡(luò)編程,Python基礎(chǔ)教程,第十五講,網(wǎng)絡(luò)編程(一)Socket詳解,關(guān)于Python的3個(gè)謊言,別再盲目學(xué)Python了(含視頻及書籍資源)??。
1.Python 中的網(wǎng)絡(luò)編程
你怎么還在用Python寫的單機(jī)版程序?因?yàn)槲椰F(xiàn)在才剛學(xué)不久 現(xiàn)在開發(fā)的基本上都是互聯(lián)網(wǎng)程序了,你要不要跟我一起學(xué)一下用Python網(wǎng)絡(luò)編程?哇!真的嗎?大佬求帶! 低調(diào)低調(diào),說到網(wǎng)絡(luò)編程,那么我們先要了解互聯(lián)網(wǎng)。我了解,互聯(lián)網(wǎng)就是把許多網(wǎng)絡(luò)連接起來。 恩,不錯(cuò),那你知道什么是TCP,UDP嗎?em,以前聽過,現(xiàn)在有點(diǎn)忘了,你可以給我說道說道嗎? 可以,我們以前的計(jì)算機(jī)網(wǎng)絡(luò),為了能夠互相通信,很多廠商都有自己的一套協(xié)議,這就弄得很亂,因?yàn)榛ゲ患嫒荩酝ㄐ牌饋砗苜M(fèi)勁。后來呢,為了讓成千上萬的計(jì)算機(jī)連接起來,定義了兩個(gè)標(biāo)準(zhǔn)的協(xié)議,一個(gè)是TCP,一個(gè)是 IP,也就是我們現(xiàn)在簡稱的 TCP/IP 協(xié)議。也就是說我們遵循 TCP/IP 協(xié)議就可以互聯(lián)了是吧! 恩,通信的時(shí)候,雙方要知道對方的標(biāo)識(shí),才能通信。那。。大佬能告訴我下 TCP 和 IP 的區(qū)別嗎? 當(dāng)然可以,那我先告訴你 IP 協(xié)議吧,假如我要發(fā)信息給你,我們都在互聯(lián)網(wǎng)上,都有自己的 IP 地址和路由,那么當(dāng)我發(fā)信息給你的時(shí)候呢,IP 協(xié)議就負(fù)責(zé)將數(shù)據(jù)進(jìn)行傳輸,這些數(shù)據(jù)被分割成一小塊一小塊的,通過 IP 包給發(fā)送過去。因?yàn)閭冎g在互聯(lián)網(wǎng)上是有很多鏈路的,所以路由就會(huì)將一小塊一小塊的數(shù)據(jù)包逐個(gè)進(jìn)行轉(zhuǎn)發(fā),直到發(fā)送到你的IP地址。但是它不能夠保證數(shù)據(jù)都能到達(dá),也保證不了能夠按順序的到達(dá)。啊~那如果丟失怎么辦?有什么辦法嗎? 有!那就是 TCP 協(xié)議,TCP協(xié)議建立在IP協(xié)議之上的。TCP協(xié)議會(huì)建立可靠連接,保證數(shù)據(jù)包按順序到達(dá)。TCP協(xié)議會(huì)通過握手建立連接,確保對方按順序收到,如果包丟掉了,就自動(dòng)的重新再發(fā)。哦,明白了,那剛剛你說的 UDP 又是? 我們已經(jīng)知道了 TCP 是面向連接的,比較可靠,而UDP協(xié)議呢,它是面向無連接的,也就是我只要知道你的IP地址和端口就可以直接給你發(fā)送數(shù)據(jù)了,不需要先跟你握手,不過數(shù)據(jù)能不能到達(dá)就不知道了。哦,明白,就是TCP可靠,UDP傳輸效率高。 對頭,所以呢,如果不要求數(shù)據(jù)可靠到達(dá)的話就可以用UDP。那么接下來我們就用 Python 來進(jìn)行 TCP 和 UDP 的編程吧。太好了!! 不過在此之前跟你講一下 Socket 的東西,因?yàn)榈认挛覀円玫?,Socket 在互聯(lián)網(wǎng)編程中表示建立了一個(gè)互聯(lián)網(wǎng)連接,Socket知道了對方的IP地址、端口號(hào)、協(xié)議,就可以建立連接了。恩,感謝大佬,明白了。 ok,那我們開始吧!1 Python 中的 TCP 編程1.1 TCP客戶端的編寫我們現(xiàn)在訪問一些網(wǎng)頁什么的,這些網(wǎng)頁是在服務(wù)器端的,而我們訪問的設(shè)備屬于客戶端。比如我們現(xiàn)在通過瀏覽器訪問這個(gè)地址: Python 來建立可靠的 TCP 連接,獲取到這些圖片呢?# 導(dǎo)入socket這個(gè)庫 import socket # 創(chuàng)建一個(gè)socket對象 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 開始建立TCP連接 s.connect(("www.meizitu.com",80)) # 連接后,發(fā)送請求 s.send(b'GET / HTTP/1.1\r\nHost: www.meizitu.com\r\: close\r\n\r\n') # 接收數(shù)據(jù) buffer = [] while True: d = s.recv(1024) if d: buffer.append(d) else: break # 把字節(jié)連接起來 data = b''.join(buffer) # 關(guān)閉連接 s.close() # 把數(shù)據(jù)讀取出來 with open('meizi.html','wb') as f: f.write(data) 運(yùn)行之后,我么就有了咱們的妹紙文件:打開有驚喜。 這就是建立TCP連接,然后客戶端向服務(wù)端發(fā)送請求的過程了。嗯嗯嗯,我懂了,我這就去試試,小姐姐等我。 瞧把你急的,服務(wù)端怎么寫不了解一下?要啊,見笑見笑,我把紙巾收回去先。1.2 TCP 服務(wù)端的編寫服務(wù)端一般都是一直在運(yùn)行著的,等待著客戶端來連接,然后給出請求響應(yīng),服務(wù)端需要提供 ip 地址和端口給客戶端去連接。首先我們來寫一個(gè)簡單服務(wù)端的:import socket # 創(chuàng)建socket對象 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 綁定監(jiān)聽端口 s.bind(('127.0.0.1',8888)) # 監(jiān)聽 s.listen(1) while True: # 接收連接 sock,addr = s.accept() print("有人連進(jìn)來了") sock.send(b'hei man, are you ok?') sock.close當(dāng)有人連接進(jìn)來我們就給他發(fā)一句:hei man,are you ok ?接著我們再來寫個(gè)客戶端的連接過去:# 導(dǎo)入socket這個(gè)庫 import socket # 創(chuàng)建一個(gè)socket對象 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 開始建立TCP連接 s.connect(("127.0.0.1",8888)) # 接收數(shù)據(jù) buffer = [] d = s.recv(1024) buffer.append(d) # 把字節(jié)連接起來 data = b''.join(buffer) print(data) # 關(guān)閉連接 s.close()然后先運(yùn)行我們的服務(wù)端,再運(yùn)行客戶端: 這就是TCP了,這里我就模擬自己一個(gè)人來連接,如果多個(gè)連接就要開啟多個(gè)線程,懂了么?懂了懂了,謝謝大佬,給~ 肥皂就不必了,我是直男。不好意思,我剛剛拿錯(cuò)了,對了,大佬,那我怎么使用Python來編寫UDP協(xié)議的呢? 你已經(jīng)知道了 TCP ,那么 UDP 也差不多的,不過UDP更簡單一些,它不需要建立可靠的連接,直接請求就可以了,我寫個(gè)代碼給你看看吧。2 Python中的 UDP 編程我們來先寫服務(wù)端:import socket # 創(chuàng)建socket對象,這里傳入的是SOCK_DGRAM,代表UDP s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 綁定監(jiān)聽端口 s.bind(('127.0.0.1',8090)) while True: # 接收連接 data,addr = s.recvfrom(1024) print(addr) s.sendto(b'hei man, are you ok?',addr)可以看到,在這里我們不需要跟對方連接,只要知道地址就直接發(fā)送過去就可以了??蛻舳耍篿mport socket # 創(chuàng)建一個(gè)socket對象 s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) s.sendto(b'ha',("127.0.0.1",8090)) # 接收數(shù)據(jù) print(s.recv(1024).decode('utf-8')) # 關(guān)閉連接 s.close()運(yùn)行如下: 這就是UDP。感謝大佬,我去試一下 恩,去吧,少看點(diǎn)妹紙圖。關(guān)注我,讓你像看小黃文一樣輕松學(xué)到 Python 的所有!ps:還沒獲取我精心準(zhǔn)備的 Python 電子書和思維導(dǎo)圖等干貨的可以在我的公眾號(hào)「學(xué)習(xí)Python的正確姿勢」中發(fā)送 python 免費(fèi)獲取哦! 點(diǎn)贊,轉(zhuǎn)發(fā)到朋友圈是一種支持
2.Python基礎(chǔ)教程,第十五講,網(wǎng)絡(luò)編程(一)Socket詳解
網(wǎng)絡(luò)編程的重要性不低于數(shù)據(jù)庫操作,而且兩者通常是同時(shí)存在,比如用python寫一個(gè)爬蟲程序,最終抓取的數(shù)據(jù)保存入庫,寫了一個(gè)web項(xiàng)目,用戶注冊,登錄,提交訂單等數(shù)據(jù)最終也要保存到我們的數(shù)據(jù)庫中,可見網(wǎng)絡(luò)編程的重要性。所以我會(huì)拿出三講的時(shí)間,分別介紹python中socket編程,爬蟲和web服務(wù)器。 和大家一起理解網(wǎng)絡(luò)編程。學(xué)完此次課程,我能做什么?學(xué)完此次課程,我們可以使用socket建立一個(gè)簡易的socket服務(wù)器和socket客戶端,并且可以進(jìn)行通信。學(xué)習(xí)此次課程,需要多久?5-10分鐘課程內(nèi)容什么是socket?socket翻譯過來稱為套接字,是一個(gè)基本的網(wǎng)絡(luò)組件,過于詳細(xì)的介紹大家可以百度一下,不在這里說了,只講幾個(gè)項(xiàng)目中的重點(diǎn):socket提供長連接,建立兩個(gè)點(diǎn)之間的信息通道;需要編寫socket服務(wù)器端和socket應(yīng)用端,可以理解為聊天程序的服務(wù)器和聊天程序的客戶端。為什么要使用socket?想一下如何實(shí)現(xiàn)一個(gè)web聊天程序?如果沒有websocket的相關(guān)知識(shí),會(huì)不會(huì)很low的用ajax實(shí)現(xiàn)?每隔5秒請求一次服務(wù)器看有沒有消息返回。這樣做的缺點(diǎn)很明顯:死循環(huán),無限請求服務(wù)器,對服務(wù)器壓力增大。實(shí)時(shí)性差,無法*時(shí)間收到消息,需要等待下次循環(huán)??匆幌翧jax方式的示意圖:有了socket這個(gè)問題就可以迎刃而解,首先客戶端與服務(wù)端建立長鏈接,服務(wù)器可以接受信息,也可以主動(dòng)推送信息給已連接的客戶端程序,而客戶端可以主動(dòng)發(fā)送給服務(wù)器信息,也可以被動(dòng)的接受服務(wù)器的推送信息??匆幌耂ocket方式示意圖:很明顯socket和http相比是長鏈接,雙向通信,11點(diǎn)58分11秒客戶端1給服務(wù)器發(fā)送了一條信息,服務(wù)器接收后立即推送給客戶端2,客戶端2通過接受方法,處理信息,顯示給用戶,優(yōu)點(diǎn)是不是很明顯?趕緊學(xué)習(xí)一下如何使用吧。上面已經(jīng)說過socket要編寫服務(wù)端和客戶端的程序,那我們先寫一下用于監(jiān)聽的服務(wù)端:注意點(diǎn):*步:創(chuàng)建socket鏈接s = socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)AF_INET:使用ipv4的方式通訊,默認(rèn)即可。type:SOCK_STREAM 是 TCP方式, SOCK_DGRAM 是 UDP方式鏈接,關(guān)于tcp和udp的協(xié)議理解大家記住TCP數(shù)據(jù)傳輸可靠,效率低于UDP。相反UDP不確保數(shù)據(jù)是否傳輸成功,效率高。第二步:bind()函數(shù),綁定ip地址和端口號(hào),linux下端口號(hào)小于1024的為系統(tǒng)保留,使用需要root權(quán)限,為了保證程序正常運(yùn)行,*使用1024以上的端口。第三步:list()函數(shù),設(shè)置允許排隊(duì)等待鏈接的數(shù)量,由于accept為阻塞方法,所以要設(shè)置等待鏈接的數(shù)量,后面我們會(huì)講如何解決阻塞。第四步:接收信息,輸出信息??匆幌驴蛻舳说拇a:客戶端相對來說比較簡單,創(chuàng)建鏈接后,使用connect()鏈接服務(wù)器即可。看一下運(yùn)行結(jié)果:服務(wù)端打印出客戶端發(fā)來的信息Hello,而客戶端輸出了 服務(wù)端返回的信息。使用python實(shí)現(xiàn)一個(gè)socket服務(wù)器就是這么簡單,其他功能也是在這個(gè)基礎(chǔ)上來實(shí)現(xiàn),無非是接受,轉(zhuǎn)發(fā),處理各類消息。小結(jié)今天我們學(xué)習(xí)了,Python中的socket,了解了如何建立一個(gè)socket服務(wù)器程序,以及客戶端如何編寫,了解了整體的流程,后期我們會(huì)在這個(gè)基礎(chǔ)上結(jié)合wxpython來實(shí)現(xiàn)一個(gè)聊天軟件。接下來學(xué)習(xí)什么?接下來,我們會(huì)學(xué)習(xí)一下大名鼎鼎的爬蟲,通過python如何快速實(shí)現(xiàn)一個(gè)簡易爬蟲。關(guān)注公眾號(hào),回復(fù) Python基礎(chǔ) 下載全部代碼+PDF版電子書
3.關(guān)于Python的3個(gè)謊言,別再盲目學(xué)Python了(含視頻及書籍資源)
本人18年自學(xué)Python,現(xiàn)在是一名前端開發(fā)。雖然不是大佬,但我還是想先潑點(diǎn)冷水!不要被市面上的各種Python培訓(xùn)廣告沖昏了頭腦:① 學(xué)完P(guān)ython,并不能立馬拿一兩萬的工資,甚至可能找不到工作!②Python也沒有那么簡單,不是有手就行!③別想著1個(gè)月、2個(gè)月就能學(xué)會(huì),你至少得騰出半年時(shí)間全職學(xué)習(xí)!如果你還是執(zhí)意要學(xué)Python,那么好,接下來我們看看怎么學(xué)。Python作為一門腳本語言,難度上相較于其他語言略微簡單點(diǎn)。但對于沒有計(jì)算機(jī)基礎(chǔ)的人來說,可能最開始配置Python編譯環(huán)境都能讓他望而卻步。這里推薦一個(gè)無需安裝配置的在線編程平臺(tái)(新手可以先在線寫一段時(shí)間的代碼,適應(yīng)下)邊學(xué)邊練,零基礎(chǔ)在線編程學(xué)習(xí)平臺(tái) 1、Python學(xué)習(xí)路線圖學(xué)習(xí)一定不是盲目的,只有先明確了要學(xué)哪些東西,怎么學(xué),才能更高效地去學(xué)Python。這是Python的整個(gè)知識(shí)體系圖譜,對于新手來說,沒必要學(xué)那么多。先把Python基礎(chǔ)和進(jìn)階知識(shí)吃透,才是入門的關(guān)鍵。后續(xù)你是往前端開發(fā)深造,還是去新潮時(shí)髦的大數(shù)據(jù)、人工智能,就全憑自己的興趣。但我相信這時(shí)候的你,應(yīng)該不會(huì)像現(xiàn)在這么迷茫。2、關(guān)于如何學(xué)Python其實(shí)網(wǎng)上的Python課程很多,都是比較有體系的。學(xué)Python入門和進(jìn)階的知識(shí),用網(wǎng)課完全足夠。但Python本質(zhì)上是對一門語言工具的運(yùn)用,實(shí)戰(zhàn)比理論更重要。我們在學(xué)習(xí)的時(shí)候一定要多敲、多練、多思考?。?!寫代碼不只是跟著視頻課或者照著書本寫完就行的,我們要理清每行代碼的邏輯。剛開始學(xué),*對每一句代碼都加以注釋,幫助我們理清邏輯,加深印象。同時(shí),學(xué)完一個(gè)知識(shí)點(diǎn)后應(yīng)該多去找對應(yīng)的案例來練習(xí),做到理論與實(shí)戰(zhàn)的深度結(jié)合。推薦一套免費(fèi)的Python課:Python入門到精通137講 這套Python課的每一個(gè)知識(shí)點(diǎn)講完,都會(huì)有對應(yīng)的實(shí)戰(zhàn)案例來練習(xí),強(qiáng)烈推薦給新手!3、Python學(xué)習(xí)資源Python學(xué)習(xí)網(wǎng)站名稱鏈接說明代碼課堂 Py編碼規(guī)范中文版 Code Examples Module of the Week Py標(biāo)準(zhǔn)庫的使用菜鳥教程 cookbook》算法類:《算法圖解》《Python算法》《算法導(dǎo)論》計(jì)算機(jī)網(wǎng)絡(luò)書籍:《計(jì)算機(jī)網(wǎng)絡(luò):自頂而下》《TCP/IP詳解1:協(xié)議》《計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ)》*,自學(xué)Python最重要的就是心態(tài)。我們在學(xué)習(xí)過程中必然會(huì)遇到很多難題,可能自己想破腦袋都無法解決。這都是正常的,千萬別急著否定自己,懷疑自己。找一個(gè)靠譜點(diǎn)的師兄,沒事知乎一下,其實(shí)這些難題也就迎刃而解了。
就拿大數(shù)據(jù)說話,優(yōu)勢一目了然,從事IT行業(yè),打開IT行業(yè)的新大門,找到適合自己的培訓(xùn)機(jī)構(gòu),進(jìn)行專業(yè)和系統(tǒng)的學(xué)習(xí)。