python學習的第32天網路程式設計part2
一、IP和ARP協議(瞭解)
乙太網協議:
(1)一組電訊號稱為一組資料報或一組資料幀
(2)但凡接入網際網路的煮雞,必須有一塊獨一無二的網絡卡
(3)所有的資料報都必須分為報頭和資料兩部分。報頭固定18個字元
IP協議:
- 規定網路地址的協議叫ip協議,它定義的地址稱之為ip地址,廣泛採用的v4版本即ipv4,它規定網路地址由32位2進製表示
- 範圍0.0.0.0-255.255.255.255
- 一個ip地址通常寫成四段十進位制數,例:172.16.10.1
ip地址分成兩部分
- 網路部分:標識子網
- 主機部分:標識主機
注意:單純的ip地址段只是標識了ip地址的種類,從網路部分或主機部分都無法辨識一個ip所處的子網
例:172.16.10.1與172.16.10.2並不能確定二者處於同一子網
2、ARP協議
作用:以廣播的方式傳送資料包,獲取目標主機的mac地址
二、套接字socket
1、socket是什麼?
翻譯過來稱為套接字,是對底層的 TCP IP UDP 等網路協議進行封裝,使得上層的應用程式開發者,不用直接接觸這對複雜,醜陋的協議
在程式設計師的言論,他就是一個封裝好的模組!要完成網路通訊,只需要使用系統提供的socket模組就行
2、TCP和UDP是傳輸層最常見的協議,主要控制傳輸資料的方式。(傳輸層)
TCP:
傳輸方式:通過三次握手來與伺服器建立連線,
優點:可以保證資料的完整性
比如:a機器給b機器傳送資料包 要求b機器必須立即返回一個確認包,a機器會等待一段時間,如果超時還沒有收到確認,則重發資料
缺點:傳輸效率低
使用場景: 文字聊天,支付寶轉賬等,
UDP:
傳輸方式:不需要建立連線,直接傳送
缺點: 不能保證資料的完整性
優點:傳輸效率比TCP高
使用場景:視訊通話,語音通話,UDP
python中的socket
在使用socket的時候使用者需要關心的是 ip地址,port埠, 傳輸協議TCP/UDP,你要傳送的資料data
在寫網路程式設計的時候,必然是有兩臺程式碼,對應著客戶端和伺服器
使用socket來完成TCP通訊
應該先完成伺服器的程式碼編寫
3、TCP的服務端:
import socket #1.買手機 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #SOCK_STEAM=>TCP流式協議, print(phone) #是用來接收連結請求,從而建立連結的 #2.插手機卡 phone.bind(('127.0.0.1',8080)) #0-65535 #3.開機 phone.listen(5) # 同一時刻最大請求數為5個 print('start....') #4.等待電話請求 conn,client_addr=phone.accept() #(雙向連結的套接字物件,存放客戶端ip和埠的小元組) # print(conn) # conn代表雙向連結,用來收發訊息 # print(client_addr) #5.收\發訊息 data=conn.recv(1024) #1024接收的最大位元組數bytes print('收到客戶的資料',data) conn.send(data.upper()) #6.掛電話連結 conn.close() #7.關機 phone.close()
4、TCP的客戶端
import socket #1.買手機 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #SOCK_STEAM=>TCP流式協議, #2.撥號 phone.connect(('127.0.0.1',8080)) #3.發\收訊息 phone.send('hello'.encode('utf-8')) # 只能發bytes型別 data=phone.recv(1024) print('收到服務端的訊息: ',data) #4.掛電話連結 phone.close()
5、UDP的伺服器
import socket # 1.建立socket物件 s = socket.socket(type=socket.SOCK_DGRAM) # 2.繫結埠和ip s.bind(("127.0.0.1",10000)) while True: # 3.接受資料 res = s.recv(1024) print(res) while True: msg = input(">>>:") # 需要獲取對方的ip和埠 #s.sendto(msg.encode("utf-8"), ("127.0.0.1", 10000)) # 關閉資源 s.close()
6、UDP的客戶端
import socket # 1.建立socket物件 c = socket.socket(type=socket.SOCK_DGRAM) while True: msg = input(">>>:") c.sendto(msg.encode("utf-8"),("127.0.0.1",10000)) c.close()
7、TCP的通訊迴圈和連結迴圈的客戶端
from socket import * server = socket(AF_INET, SOCK_STREAM) server.bind(('127.0.0.1', 7500)) server.listen(5) while True: while True: conn, client = server.accept() data = conn.recv(1024) conn.send(data) conn.close() server.close()