Python-網絡編程(一)

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

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

  你們經過上面的內容大體的瞭解了一下什麼是網絡通訊,那麼在咱們的平常生活中,哪裏用到了網絡通訊呢,網絡通訊的整個流程又是什麼樣子的呢?咱們要學的socket是怎麼在網絡中發揮做用的呢?讓咱們懷揣着這 三個問題 來進行下面的學習。web

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

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

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

    a.硬件C\S架構:打印機。windows

    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地址能夠設置成靜態的、也能夠自動獲取(動態分配的),下面是網絡配置的大體方法:

      一、

      

      二、

      

 

       三、

      

       配置好本身電腦的網絡信息以後,咱們就有了身份證(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溝通更加方便。

相關文章
相關標籤/搜索