標籤:需要 except 報錯 tcp name mac smtp put cnn
一、socket文法
網路七層模型(OSI模型)
1物理層——>2資料連結層(mac地址)——>3網路層(IP)——>4傳輸層(TCP/IP 、UDP協議傳輸)——>5會話層——>6展示層——>7應用程式層(http、ftp、smtp、pop3)
socket文法及相關知識點:
socket是為兩個程式之間建立一個雙向通道,來實現資料轉送。 網路通訊是通過ip+port來定位具體的目標機器的具體的服務,作業系統有0-65535個連接埠,每個連接埠獨立對外提供服務。
建立一個socket必須有兩個端:服務端和用戶端
服務端:被動等待接受用戶端的請求
建立流程:1.建立一個socket執行個體sk——>sk.bind()設定服務端可監聽的網路地址和連接埠號碼——>sk.listen()開始監聽——>
cnn,val=sk.accepr()接受用戶端的串連——>cnn.recv()接受資料——>cnn.send()發送資料——>close
1、建立一個socket執行個體 :socket.socket()
1 import socket2 server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
第一個參數為:地址簇
socket.AF_INET ipv4
socket.AF_INET6 IPV6
socket.AF_UNIX unix本機進行之間通訊
第二個參數:socket類型
socket.SOCKET_STREAM for tcp
socket.SOCKET_DGRAM for udp
socket.SOCK_RAW 原始通訊端,普通的通訊端無法處理ICMP、IGMP等網路報文,而SOCK_RAW可以;其次,SOCK_RAW也可以處理特殊的IPv4報文;此外,利用原始通訊端,可以通過IP_HDRINCL通訊端選項由使用者構造IP頭。
socket.SOCK_RDM 是一種可靠的UDP形式,即保證交付資料報但不保證順序。SOCK_RAM用來提供對原始協議的低級訪問,在需要執行某些特殊操作時使用,如發送ICMP報文。SOCK_RAM通常僅限於進階使用者或管理員啟動並執行程式使用。
2、 綁定地址:sk.bind(address)
address的格式取決於地址簇,如果是IPV4,則以元祖的形式傳入地址
1 server.bind((‘0.0.0.0‘,8001))
3、開始監聽:sk.listen(backlog)
開始監聽傳入的串連,backlog表示在拒絕串連之前,可掛起的最大串連數,backlog最大為5
1 server.listen(5)
4、接收串連並返回新通訊端對象和用戶端地址
1 cnn,client_addr=server.accept()
cnn為新的通訊端對象,clinet為串連的用戶端地址
5、接受和發送用戶端資料
1 cnn.recv(1024)2 cnn.send(b‘got your msg‘)
用戶端:主動向服務端發送請求
流程:建立一個socket執行個體c——>c.connect()串連服務端——>c.send()發送資料——>c.recv()接受資料——>c.close()
1 import socket2 client=socket.socket() # 1、建立socket執行個體3 client.connect((‘localhost‘,8001)) #2、串連4 msg=input(‘>>:‘)5 client.send(msg.encode()) #3、發送資料6 print(‘send:%s‘ %msg)7 data=client.recv(1024)8 print(‘receive from server:%s‘%data) #4、接受資料
下面是小練習:
服務端:
1 import socket 2 server=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 3 server.bind((‘127.168.0.1‘,8001)) 4 server.listen(5) 5 print(‘------------start to listen--------‘) 6 while True: #用戶端斷開與服務端的串連時,防止直接跳出第二個迴圈後,報錯,而是回到該迴圈,重新接受其他用戶端的請求 7 cnn,client_addr=server.accept() 8 print(cnn,client_addr) 9 while True:10 try:11 data=cnn.recv(1024) #有一個用戶端中斷連線是,recv不到串連,會報錯,用try來進行異常處理,防止程式終止12 print(‘用戶端:%s‘%data)13 s_data=input(‘服務端:‘)14 cnn.send(s_data.encode())15 except ConnectionResetError as e:16 print(e)17 break
用戶端:
1 import socket 2 client=socket.socket() 3 client.connect((‘127.168.0.1‘,8001)) 4 5 while True: 6 msg=input(‘用戶端:‘) 7 client.send(msg.encode()) 8 # print(‘send:%s‘ %msg) 9 data=client.recv(1024)10 print(‘服務端:%s‘%data)
python-網路編程-socket編程