1. 程式人生 > >Python-網路程式設計(一)

Python-網路程式設計(一)

首先我們python基礎部分已經學完了,而socket是我們基礎進階的課程,也就是說,你自己現在完全可以寫一些小程式了,但是前面的學習和練習,我們寫的程式碼都是在自己的電腦上執行的,雖然我們學過了模組引入,檔案引入import等等,我可以在程式中獲取到另一個檔案的內容,對吧,但是那麼突然有一天,你的朋友和你說:"把你電腦上的一個檔案通過你自己寫的程式傳送到我的電腦上",這時候怎麼辦?你是不是會想,what?這怎麼搞?就在此時,突然靈感來了,我可以通過qq、雲盤、微信等傳送給他啊,可是人家說了,讓你用自己寫的程式啊,嗯,這是個問題,此時又來一個靈感,我給他傳送檔案肯定是通過網路啊,這就產生了網路,對吧,那我怎麼讓我的程式能夠通過網路來聯絡到我的朋友呢,並且把檔案傳送給他呢,那麼查了一下,發現網路通訊通過socket可以搞,但是怎麼搞呢?首先,查詢結果是對的,socket就是網路通訊的工具,任何一門語言都有socket,他不是任何一個語言的專有名詞,而是大家通過自己的程式與其他電腦進行網路通訊的時候都用它。知道為什麼要學習socket了吧~~朋友們~~而你使用自己的電腦和別人的電腦進行聯絡併發送訊息或者檔案等操作就叫做網路通訊。

  對於一個小白來講,看到這一節標題的你,此刻的你內心是拒絕的,不明白在說些什麼。我理解你的心情,不要驚慌、不要著急,且聽我娓娓道來。

  大家通過上面的內容大致的瞭解了一下什麼是網路通訊,那麼在我們的日常生活中,哪裡用到了網路通訊呢,網路通訊的整個流程又是什麼樣子的呢?我們要學的socket是怎麼在網路中發揮作用的呢?讓我們懷揣著這 三個問題 來進行下面的學習。

一.CS(服務端/客戶端)架構

  我們使用qq、微信和別人聊天,通過瀏覽器來瀏覽頁面、看京東的網站,通過優酷、快播(此處只是懷念一下)看片片啥的等等,通過無線印表機來列印一個word文件等,只要有無線、有網、有4G,我們就能好好的聊天,好好的看片片、好好的購物什麼的,對吧,那麼這些操作都叫做網路通訊,確切來說都需要使用網路通訊,前提是你要有網(大家記著這個'網',我下面會給大家詳解),原來生活中處處使用了網路通訊,我們通過網路通訊的不同形式:比如說qq是我們下載到電腦或者手機上的應用程式(qq應用程式就是人家騰訊開發的軟體,放到你的電腦或者手機上供你使用的,大概明白應用程式意思就行,不用深究~~),瀏覽器也是我們下載的應用程式,但是瀏覽器是通過頁面來訪問別人的網站的,而印表機我是通過我電腦上的word來操作使用的。根據這些不同的場景或者說不用的溝通方式,在業內劃分了下面兩個架構(架構:就是不同的組成結構)。在看下面的幾個架構之前,我們需要知道什麼是客戶端,什麼是服務端。客戶端:安裝在你電腦上的qq,瀏覽器(360瀏覽器、chrome瀏覽器、IE瀏覽器等),當我們使用qq傳送訊息的時候,訊息先發送到了騰訊,然後騰訊在轉發到你朋友的qq上,此時你的qq就是客戶端,騰訊就是服務端。當我們使用瀏覽器來看京東的網站的時候,我們電腦上的瀏覽器就叫做客戶端,京東就叫做服務端。

客戶端英文名稱:Client(使用服務端的服務),服務端英文名稱:Server(一直執行著,等待服務別人,不能有一天訪問百度,百度頁面打不開,不行吧。),下面所說的C\S架構就是說的Client\Server架構。

    a.硬體C\S架構:印表機。

    b.軟體C\S架構:QQ、微信、優酷、暴風影音、瀏覽器(IE、火狐,360瀏覽器等)。其中瀏覽器又比較特殊,很多網站是基於瀏覽器來進行訪問的,瀏覽器和各個網站服務端進行的通訊方式又常被稱為B\S架構(瀏覽器英文名稱:Browser),web開發就是這個,後面大家知道有前端的課程對吧,前端就是瀏覽器上的知識,以後你會經常和瀏覽器打交道,學完前端就可以進行web開發全棧開發了。如果我把所有的東西都做成應用程式是不是很麻煩啊,要裝很多的軟體對吧,所有就開始有了B\S架構,只需要個瀏覽器就能使用很多的工具了,並且提供了一個統一入口,這也是為什麼B\S架構火了起來。但是手機端的還是用的應用程式多一些,但是手機端B\S架構也是一個趨勢,就像微信的小程式和公眾號,為什麼說是一個趨勢呢,不僅僅是因為方便因為省錢,而是提供了一個統一的入口,其實微信早就實現了。統一入口是什麼意思呢?就像我們公司經常用的一個公司內部管理系統,請假、打卡、報銷、查客戶等等,如果這些功能都需要開啟一個網頁或者app,是不是很難受啊,那麼公司就做了這麼一個系統,大家在這個系統上關於上班的一些你需要的功能就都能完成了,這就是統一入口。這也是一個開發思想,大程式分成幾個小程式,開發速度也快,開發一個小功能就能上線,而不需要等著所有的功能全部開發完成才上線,解耦分治思想,公司做開發時這種思想很流行,迭代開發。說多了。。

    不管哪個架構,他們都要進行網路通訊,基本都要用socket,我們學習socekt就是為了完成C\S架構專案的開發

二.網路通訊流程

  明白了上面的C\S架構之後,我們就以自己本地的電腦上的瀏覽器去訪問的京東網站的整個流程這種B\S架構來舉例,有同學可能會問:你怎麼不用qq或者微信來舉例啊,是這樣,因為qq和微信這種P2P的通訊方式還是比較特殊的,也比較繁瑣,具體為什麼說它繁瑣,我在部落格的最後給大家說一下,然後有興趣的同學可以去研究一番~~~

  網絡卡和mac地址

    你的電腦想要聯網,首先要有一個網絡卡,而且電腦要做好相關的網路配置(如何配置,在下面有介紹)

    電腦插網線的地方就做網絡卡,網絡卡提供了網路的介面,這是硬體上面的,大家都是到網口是吧,我怎麼找到電腦的網絡卡呢,有人說用IP地址,IP地址並不是,而是全球唯一的mac地址,專門給網路裝置設定的,是出廠的時候就給定好的,一個裝置的mac地址號碼是全球唯一的。 head中包含的源和目標地址由來:ethernet規定接入internet的裝置都必須具備網絡卡,傳送端和接收端的地址便是指網絡卡的地址,即mac地址。   mac地址:每塊網絡卡出廠時都被燒製上一個世界唯一的mac地址,長度為48位2進位制,通常由12位16進位制數表示(前六位是廠商編號,後六位是流水線號)

      檢視mac地址的方法:windows下在cmd視窗輸入ipconfig -all指令:下面顯示的這個實體地址就是mac地址。

 

    由於mac地址很難記憶,所以又出現了IP地址,在說IP地址之前,我們先說一下編碼,我們都是到一個位元組等於8位對吧,8個2進位制的數,那麼8位是不是可以表示256個位元組啊,由於全球有太多的機器需要聯網,那麼網路裝置的編號應該長一些,對不對,由4個點分十進位制組成,由點分割的四個十進位制的數,而十進位制的數是不是在計算機中也是由二進位制表示的啊,那麼就成了這個樣子:00000000.00000000.00000000.00000000 -- 11111111.11111111.11111111.11111111,0.0.0.0--255.255.255.255,也就是由4個8位的二進位制數表示,這個表示就是我們的IP地址的形式。

      如果你用網線連網的,檢視自己網路的屬性,並且可以將ipv4版本的ip地址可以設定成靜態的、也可以自動獲取(動態分配的),下面是網路配置的大致方法:

      1、

      

      2、

      

 

       3、

      

       配置好自己電腦的網路資訊之後,我們就有了身份證(mac地址)和名字(IP地址),通過他們,我們就在網路中有了自己的身份,只要有網,我們就可以正大光明的和別人進行通訊了。

      arp協議功能:廣播的方式傳送資料包,獲取目標主機的mac地址

      下面是網路通訊流程圖:

  流程描述:

  第一步:開啟瀏覽器,想要請求訪問京東,在位址列輸入了網址:www.jd.com。(www.jd.com是域名就是一個IP地址的名稱,IP地址不好記,所有有了域名。)

  第二步:先將請求資訊發給了交換機,然後交給了路由器,路由發給DNS伺服器,通過DNS協議去找我們要訪問的京東的IP地址:

  第三步:查到的京東伺服器對應的IP地址之後,路由器通過路由協議找到一個路由轉發的最優路徑,將你的請求資訊還送給這個IP地址的京東的路由器

  第四步:京東的路由器發給了京東網站的伺服器上

  第五步:京東網站伺服器按照來的時候的路徑,在返回給你他自己的網站

  第六步:當你開啟瀏覽器的時候,你的電腦給你的瀏覽器這個執行起來的程式給了一個編號,叫做埠號,當你的電腦收到京東傳送過來的訊息的時候,你的電腦通過埠號找到你的瀏覽器,你的瀏覽器拿到了京東的網站資訊,然後將網站呈現在了自己的瀏覽器上

  內網和外網:   

    所謂內網就是我們平常說的區域網。區域網就是在固定的一個地理區域內由2臺以上的電腦用網線和其他網路裝置搭建而成的一個封閉的計算機組。它可以是鄰居之間的2臺電腦,也可以是一幢100層大樓裡的1000臺電腦。區域網可以是獨立封閉執行的,也可以是和外網相連線的。
所謂外網,也就是廣域網。是一種地域跨度非常大的網路集合。它是由無數個區域網+獨立伺服器構成的。注意,此處所說的區域網既可以是小型的廣域網,也可以是區域網。
    實際上,從規模上來看我們很難分辨區域網與廣域網,因為大小都是相對的。所以。真正區域網與廣域網的分別是通過IP地址來實現的。
    任何一臺電腦要上網,都必須在網路上有一個唯一的IP地址。在區域網內,這個IP地址是唯一的。但是在另外一個區域網,這個IP地址仍然能夠使用。
    網路A裡有一臺IP地址為192.168.1.231的客戶端,網路B裡也可以有一臺同樣IP的電腦。那麼。我們就說這2臺機器分別在2個局域網裡。但是在廣域網內,所有的IP地址都是唯一的。山西電信的DNS伺服器IP地址是61.134.1.4.那麼,這個地址在全世界都是唯一的,不可重複的。這就是廣域網和區域網的區別。

    如果只有內網的ip地址你是不能上網的,你上網肯定要通過一個外網地址,這個外網地址又稱為公網地址,這個公網地址是全球唯一的,他在你的對外出口的路由器上,也就是你的外網閘道器地址

三.初始socket

  還記得上面我說過的那個'網'嗎,在這一節就給大家講解,有些同學對網路是既熟悉又陌生,熟悉是因為我們都知道,我們安裝一個路由器,拉一個網線,或者用無限路由器,連上網線或者連上wifi就能夠上網購物、看片片、吃雞了,但是這一系列的神操作到底是怎麼讓我們上網了呢?讓我們起底揭祕!由於網路的內容非常的多,本篇部落格主要是學socket網路程式設計,所以我把網路這方面的內容放到了我另外一篇部落格上,這個部落格很簡單,不是什麼深入研究類的部落格,有網路基礎的同學,可以直接往下面學習

  別忘了埠+IP能夠確定一臺電腦上的某一個應用程式~~

  那麼我們通過下面的程式碼簡單看一下socket到底是個什麼樣子,大概怎麼使用:下面的程式就是一個應用程式,和qq啊、微信啊是一樣的,都叫做應用程式。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 import  socket #建立一個socket物件 server  =  socket.socket()   #相當於建立了一部電話 ip_port  =  ( '192.168.111.1' , 8001 #建立一個電話卡 server.bind(ip_port)  #插上電話卡 server.listen( 5 #監聽著電話,我能監聽5個,接到一個電話之後,後面還能有四個人給我打電話,但是後面這四個人都要排隊等著,等著我第一個電話掛掉,再來第6個的時候,第六個人的手機會報錯 print ( '11111' ) #等著別人給我打電話,打來電話的時候,我就拿到了和對方的這個連線通道conn和對方的電話號碼addr conn,addr  =  server.accept()   #阻塞住,一直等到有人連線我,連線之後得到一個元祖,裡面是連線通道conn和對方的地址(ip+埠) print ( '22222' ) print (conn) print ( '>>>>>>>>>' ,addr) while  True :      from_client_data  =  conn.recv( 1024 #服務端必須通過兩者之間的連線通道來收訊息      from_client_data  =  from_client_data.decode( 'utf-8' )      print (from_client_data)      if  from_client_data  = =  'bye' :          break      server_input  =  input ( '明威說>>>>:' )      conn.send(server_input.encode( 'utf-8' ))      if  server_input  = =  'bye' :          break conn.close()  #掛電話 server.close()  #關手機

  listen(3),這個3的意思是我連線著一個,後面還可以有三個排隊的,也就是支援4個人的服務,但是後面三個要排隊。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #_*_coding:utf-8_*_ import  socket import  time   client  =  socket.socket() server_ip_port  =  ( '192.168.111.1' , 8001 )   client.connect(server_ip_port)   while  True :      client_input  =  input ( '小文說>>>>:' )      client.send(client_input.encode( 'utf-8' ))  #給服務端傳送訊息      if  client_input  = =  'bye' :          break      from_server_data  =  client.recv( 1024 )        print ( '來自服務端的訊息:' ,from_server_data.decode( 'utf-8' ))      if  from_server_data.decode( 'utf-8' = =  'bye' :          break client.close()  #客戶端掛電話

  注意:先執行server,然後再執行client,然後你會發現client這個檔案再輸出臺的地方讓你輸入內容,你輸入一個內容然後回車,你會發現server那邊的控制檯就輸出了以client傳送的內容

四 總結及其他一些內容簡介

  最後,至於路由是如何進行轉發的、內部路由表是如何儲存的、閘道器是如何計算最後傳輸路線的、路由的內網是如何劃分的、DHCP和靜態IP是如何設定的,DHCP又是如何分配IP地址的,交換機內部工作原理、路由和交換機如何進行配置等等,我們在本篇部落格上就不進行深入研究了,本篇部落格是為了讓小白同學熟悉一下網路相關知識。謝謝大家諒解,如何大家想了解其他的內容,請給我留言,我就會把相關內容整理出來,分享給大家。你的問題是我們共同進步的動力。

  為什麼說qq這種p2p的網路通訊方式比較特殊呢,因為它是兩個區域網的電腦或者手機進行通訊,雙方不能確定對方的IP地址,因為你的qq也不知道在哪裡登陸,用什麼網路,對吧,也就是說雙方不知道對方的IP地址,怎麼辦,需要藉助第三方承接,就是騰訊,那麼這裡面就涉及到了udp打洞,net穿透等技術,有興趣的可以去了解一下,騰訊為什麼nb,也是因為它基本上是國內第一家實現了這些技術的公司,讓我們的qq溝通更加方便。