1. 程式人生 > >python學習的第32天網路程式設計part2

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()