程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

讓python飛:形象理解python網絡編程、IP、端口、網絡模型、socket套接字、tcp協議、udp協議

編輯:Python


Day18小豬佩奇造火箭和喬治交流
小豬佩奇想念弟弟了,但是他又不能見到弟弟,所以他想發明一種能讓他和弟弟進行交流的工具
網絡編程:讓多台計算機之間可以進行通信(數據交互),涉及到了網絡編程,劃分為兩個方向層面:1).我們稱為客戶端(cilent) 2).我們稱為服務端(server))於是他造了一只火箭。首先他要告訴火箭自己的家的住址IP地址的作用:如果我們需要上網,每台計算機都會有一個唯一標識(符號),就是我們所謂的ip地址,ip地址是每台計算機在網絡中的唯一標識(記住))但是他記不住家裡的住址編號,所以就問小機器人管家,向它的小屏幕裡輸入ipconfig,然後他就把家裡的住址編號告訴了佩奇。佩奇對家裡的編號產生了好奇,這是由四個數字組成的編號(一個IPV4的地址是由四段0—255的數字組成:192.168.0.100)它是佩奇家地址的唯一標識。管家告訴佩奇,你要發射火箭的話,要問問我們有沒有發射權,向我的小屏幕裡輸入’ping 空格127.0.0.1’,如果有回應就代表我們家有發射權啦利用“ping”命令可以檢查網絡是否連通,可以很好地幫助我們分析和判定網絡故障。應用格式:ping空格IP地址。127.0.0.1:本機回環地址(解析為本機的ip),理解:localhost)小豬佩奇試了一下,果然有回應,於是,他開心極了!
火箭有了,但是得給他個編號啊(端口:一台計算機可能被裝載很多的應用程序,如果我們需要去實現網絡編程的話,在兩個計算機之間程序數據交互需要通過端口號來找到相應的應用程序;理解:端口號是計算機中應用程序的唯一標識)家裡面的所有東西都編過號了,所以1023以下的數字都不能用(范圍:0~65535之間:注意:0~1023之間的端口我們不能直接設置使用,因為它們在安裝完畢操作系統之後就被系統占用了;)像沖浪板代號為80(http:80)運貨小卡車的編號為22(ftp: 22)郵筒編號為25(smtp:25)所以啊,你可以用1024到65535之間的數字進行編號。不過我們村的數字檔案館已經把3306給用了(mysql:3306)字典管理中心已經把6379給用了(redis:6379)所以你盡量用其他數字給你的火箭編號吧(通過IP地址可以連接到指定計算機,但如果想訪問目標計算機中的某個應用程序,還需要指定端口號。在計算機中,不同的應用程序是通過端口號區分的。端口號是用兩個字節(16位的二進制數)表示的,它的取值范圍是0~65535,其中,0~1023之間的端口號用於一些知名的網絡服務和應用,用戶的普通應用程序需要使用1024以上的端口號,從而避免端口號被另外一個應用或服務所占用。)於是小豬佩奇開始設計火箭及其交流的方式。
佩奇心想,這交流起來,喬治那邊的火箭和我的火箭得有個碰面的地方,小時候我們經常在停車棚玩,就在它們在那裡碰面吧(tcp協議:特點:面向連接、可靠(安全)、效率慢 類似於我們生活中的:打電話)兩個火箭見到面後首先要確認是不是對方,要先三次握手

tcp的連接過程:3次握手
cilent(客) sever(服)
a:哥們,能聽見我說話嗎?
b: 我能,你能聽見我說話嗎?
a: 我也能,我們開始說話吧
此處正在進行數據交互

兩個火箭交流完後,告別時要揮手(斷開連接的過程:第4次揮手 --> 程序中的體現:close())
和喬治聯系前,要先把存放火箭的箱子拿出來(導入socket模塊:import socket)從裡面拿出一個火箭來

得到客戶端的socket對象
tcp_cilent_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

這火箭頭的小倉裡得放上我的地址編號的理解方式(第一個參數:滿足的是ipv4的規則(socket.AF_INET))和交流的方式,在停車棚就按面對面即時交流(第二個參數:判斷/確定到底是滿足tcp協議還是udp協議的規則編程(socket.SOCK_STREAM))然後把自己家的地址編號和火箭的編號都寫到紙上(#定義服務器的ip和端口號(封裝到一個元祖對象中)tcp_server = ('10.11.63.132',8888))貼在火箭上(連接服務器tcp_cilent_socket.connect(tcp_server))然後我就可以在家裡不停的和喬治說話了(循環發送和接受數據while 1:)#客戶端從鍵盤輸入數據(字符串)data = input('>>>:')當然,為了保密,火箭會將我說的信息進行編密後再給喬治的火箭(將客戶端的數據發送給服務器,我們在這個過程中需要對數據進行編碼操作(有一定的安全性保障) tcp_cilent_socket.send(data.encode('utf-8'))當然,他也能收到喬治的火箭回復的信息(接受服務器給客戶端傳遞(發送)過來的數據並且進行解碼操作 recv_data = tcp_cilent_socket.recv(1024)在家裡,佩奇將它用相應的編碼格式打印出來(print('服務器:' + recv_data.decode('gbk')))最後,佩奇的火箭將和喬治的火箭說拜拜然後關閉回家(關閉套接字對象tcp_cilent_socket.close()
喬治那邊的火箭怎麼設計呢?同樣,喬治也要先拿出火箭盒子(import socket)拿出火箭,並將喬治家的地址編碼解析方式和地點放在小倉內

#得到服務端的socket對象
tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

再把地址編號和火箭編號貼在火箭上

#綁定服務端的ip和端口號(元祖)tcp_server = ('10.11.62.101',8888)
tcp_server_socket.bind(tcp_server)

到了停車棚後,先打開耳朵,開啟監聽模式(#開啟監聽tcp_server_socket.listen())由於佩奇的火箭會將佩奇的信息和他的地址火箭信息發過來,喬治的火箭設計將接受後將信息分成兩部分,佩奇的主要信息存放到一個新的小火箭裡(#接受客戶端的訪問new_socket,cilent_info = tcp_server_socket.accept())開始受到佩奇的信息,小火箭將其存儲,然後喬治在家裡就可以打印出來,但是要用相應的解碼方式

#接受客戶端發來的數據
recv_date = new_socket.recv(1024)
print('客戶端:' + recv_date.decode('utf-8'))

然後喬治在家裡信息錄入,小火箭編密後再送到佩奇火箭那裡

#給客戶端發送數據data = input('>>>:')
new_socket.send(data.encode('gbk'))

最後,小火箭先關閉,大火箭再關閉回去(#關閉兩個套接字對象new_socket.close() tcp_server_socket.close())
還有一種情況是,佩奇的火箭到達後喬治的火箭不在怎麼辦?佩奇想起有一家店鋪叫u店鋪(udp協議:特點:面向無連接、不可靠、效率快。類似於我們生活中的:寫信)他可以先讓火箭把信息送到店鋪,喬治的火箭去了再拿信息。同樣,也要先從火箭箱子裡拿出火箭(import socket使用udp協議編寫客戶端程序: 實例化socket對象)然後,在火箭的頭上的小倉裡寫上地址的編碼解析方式和見面的地點

#得到客戶端的socket對象
udp_client_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

將喬治家的地址編號和火箭編號寫在倆丸子上

#定義服務器的ip和端口號封裝到元祖對象中
udp_server = ('10.11.63.119',6666)

然後,佩奇開始在家裡輸信息

#循環發送和接受數據
while 1:
data = input('>>>:')

火箭將數據編譯好,將數據和那倆丸子一同放進火箭裡送過去

#客戶端給服務器發送數據
udp_cilent_socket.sendto(data.encode('utf-8'),udp_server)

還要將佩奇返回的倆丸子存起來

#接受服務器給客戶端的數據
recv_data = udp_cilent_socket.recvfrom(1024)

佩奇在家裡將第一個丸子用相應的解碼方式打印出來

#得到一個元祖對象,我們需要的服務端發送過來的數據信息存儲在此對象的第一個元素位上
print(recv_data)
print('服務器說:' + recv_data[0].decode('gbk'))

最後,將火箭關閉

#關閉套接字對象
udp_cilent_socket.close()


喬治的店鋪火箭也是得先從火箭箱子裡拿出來(import socket然後實例化 udp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM))將自己的住址編號和火箭編號刻在倆丸子上,貼在火箭上

#綁定服務端的ip和端口
udp_server = ('10.11.62.88',8888)
udp_server_socket.bind(udp_server)

到了店鋪後,開始接收佩奇的火箭裡的倆丸子,喬治在家把第一個丸子解碼打印

#循環接受和發送數據:
while 1:
#接受客戶端的數據
recv_data,cilent_info = udp_server_socket.recvfrom(1024)
print(recv_data)
print(cilent_info)
print('客戶端說:' + recv_data.decode('gbk'))

並在家把要回復的信息編碼後,和佩奇的第二個丸子一塊放進火箭送回去

#發送數據給客戶端
data = input('>>>:')
udp_server_socket.sendto(data.encode('gbk'),cilent_info)

最後關閉火箭

#關閉套接字對象
udp_server_socket.close()

佩奇設計出的火箭非常成功,喬治為他感到非常驕傲。


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved