26 socket簡單操做

一 爲何要學習socket

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

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

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

二 客戶端\服務端架構(哪裏用到了網絡通訊)

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

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

    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架構項目的開發瀏覽器

三 網絡通訊的整個流程

還記得上面我說過的那個'網'嗎,在這一節就給你們講解,有些同窗對網絡是既熟悉又陌生,熟悉是由於咱們都知道,咱們安裝一個路由器,拉一個網線,或者用無限路由器,連上網線或者連上wifi就可以上網購物、看片片、吃雞了,可是這一系列的神操做究竟是怎麼讓咱們上網了呢?讓咱們起底揭祕!因爲網絡的內容很是的多,本篇博客主要是學socket網絡編程,因此我把網絡這方面的內容放到了我另一篇博客上,這個博客很簡單,不是什麼深刻研究類的博客,沒有學過網絡的或者說對網絡不太熟悉的同窗能夠去看看,地址是網絡通訊的整個流程,有網絡基礎的同窗,能夠直接往下面學習,若是你自認上學時是個學渣,也能夠過去大體溜一眼~~~未來你面向的是開發,全部網絡這一塊對你來說就是大體知道就能夠了,可是之後想在技術上有深造,那麼就須要你深刻的研究一下網絡了,內容很是多,學海無涯~~微信

別忘了端口+IP可以肯定一臺電腦上的某一個應用程序~~網絡

 那麼咱們經過下面的代碼簡單看一下socket究竟是個什麼樣子,大概怎麼使用:下面的程序就是一個應用程序,和qq啊、微信啊是同樣的,都叫作應用程序。

  

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() #關手機

test_server.py
View Code

 

 

  listen(3),這個3的意思是我鏈接着一個,後面還能夠有三個排隊的,也就是支持4我的的服務,可是後面三個要排隊。

#_*_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() #客戶端掛電話

test_client.py
View Code

 

 

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

   

  今天的內容就到這裏,今天學習的怎麼樣啊同窗們,你們好好再從新過一遍,而後把練習題作一作。

==============================================

  這裏留兩個小練習:
    1.
      server端:接收時間戳時間,轉換成格式化時間
      client端:每隔10秒中把時間戳發給server端,time.time()
import time

t = time.time() #獲取時間戳
str_t = str(t)
print(str_t)


stru_t = time.localtime(float(str_t)) #將時間戳轉換爲結構化時間

s2 = time.strftime('%Y-%m-%d %H:%M:%S',stru_t) #將結構化時間轉爲格式化時間
print(s2,type(s2))

時間轉換(先本身寫,先不要看這裏面的內容)
View Code

 

    2.  一直對話的程序
      server收一個發一個
      client發一個收一個
服務端:
import socket
while 1:
    server = socket.socket()
    ip_port = ('192.168.12.48',8041)
    server.bind(ip_port)
    server.listen()
    conn,addr = server.accept()
    from_client_msg = conn.recv(1024)
    print(from_client_msg.decode('utf-8'))
    remsg = input('請輸入要返回的話:')
    conn.send(remsg.encode('utf-8'))
    conn.close()
    server.close()
View Code

客戶端:

import socket
while 1:
    client = socket.socket()
    server_ip_port = ('192.168.12.48', 8041)
    client.connect(server_ip_port)
    inmsg = input('請輸入要說的話:')
    client.send(inmsg.encode('utf-8'))
    from_server_msg = client.recv(1024)
    print(from_server_msg.decode('utf-8'))
    client.close()
View Code

 筆記

相關文章
相關標籤/搜索