網路 協議 套接字socket TCP程式設計
網路;
通過物理線路將多臺計算機連線起來組成網際網路計算機平臺,實現多臺計算機的資料交換。
網路協議 ip --Internet protocal;32位(二進位制) 是一套通用規則,為了多臺計算機能在網路上進行網路通訊互聯而設計的協議。
本機地址;127.0.0.1 ~127.255.255.255 子網掩碼;專門針對不同型別的 IP 地址進行的網路地址和主機地址的規則定義 路由器->給主機分配IP地址時 WAN口:廣域網地址[都會網路地址] LAN口:區域網地址
port埠; 區別不同軟體的通訊渠道,用於正確的將資料通過指定的入口傳給對應的軟體。 範圍0~65535 埠號根據其使用場景,一般區分為公用埠、動態埠、保留埠 公用埠: 0~1023 動態埠: 1024~65535 保留埠:一般是 unix 系統中超級使用者程序分配保留埠號 建議一般使用8000以後埠 MySQL;3306 mangodb;27017 redis;6379
檢視主機正在使用的埠;netstat -ano 檢視當前主機中某個埠號是否被使用: netstat –ano | findstr port
協議;約定,規則,規範
為了讓工作在網路中的多臺計算機之間能友好的完成不同軟體的資料的通訊,出 現了網際網路資料傳輸協議的概念, 通過協議的約束,不同地域環境的計算機可以通過網路完 成流暢的正確的資料互動。
ISO;歐洲計算機制造協會聯盟(國際標準化組織) 計算機網路資料傳輸協議目前最主流的就是歐洲計算機制造協會聯盟,也稱為國際標準化組織 ISO 指定的 OSI/RM 七層網路傳輸模型。 七層模型-從操作應用層到物理線路的傳輸通訊 1.應用層 2.表示層 3.會話層 4.傳輸層 5.網路層 6.資料鏈路層 7.物理層 四層模型概念
PYTHON 傳輸層網路程式設計
傳統網路程式設計 非阻塞非同步網路程式設計
socket 套接字;
套接字區分為兩種; 面向檔案;通過檔案進行資料交換 面向網路;通過網路進行資料交換
地址家族Address Family—AF 協議家族Protocal Family—PF AF_INET 是傳統第四個版本的因特網協議定址[IPv4], AF_INET6 用於支援第六個版本的因特網協議定址[IPv6]
PYTHON中套接字; TCP-面向連線的套接字模型,在進行網路資料傳輸過程中,首先要建立一個連線模型,通過指定的連線模型進行資料的互動。 TCP協議的基礎上,資料能最大限度的保證完整性和正確性的進行資料端對端傳輸。
UDP–面向無連線的套接字模型,在進行網路資料傳輸過程中,不需要有效的網路連線模型,在資料傳輸過程中只負責傳送/接受,不保證資料的完整性和實效性;類似我們生活中的廣播電臺、電視訊號等等,操作效率要比面向連線的套接字模型更加高效.
socket 套接字常用操作
s.bind() 繫結(主機名稱、埠)到一個套接字上 s.listen() 設定並啟動 TCP 監聽 s.accept() 等待客戶端連線 s.connect() 連線指定伺服器 s.connect_ex() 連線指定伺服器,如果出現錯誤返回錯誤資訊 s.recv() 接受 TCP 訊息 s.recv_into() 接受 TCP 訊息到緩衝區 s.send() 傳送 TCP 訊息 s.sendall() 完整發送 TCP 訊息 s.recvfrom() 接受 UDP 訊息 s.recvfrom_into() 接受 UDP 訊息到緩衝區 s.sendto() 傳送 UDP 訊息 s.shutdown() 關閉連線物件 s.close() 關閉套接字物件
TCP程式設計
經典的 TCP 模型中通過如下兩種方式完成連線的可靠性 三次握手建立連線; 1.A---->B 傳送定址請求碼sep A<----B 返回應答 ack 2.A---->B 傳送確認請求碼sep 確認連結 A<----B 返回應答 ack 3.A---->B 傳送連線請求碼sep A<----B 返回應答 ack 連線A–B
四次揮手斷開連線; 1.A---->B 傳送資料驗證請求碼sep A<----B 返回應答 ack 2.A---->B 傳送傳輸結束請求碼sep A<----B 返回應答 ack 3.A---->B 傳送確認結束請求碼sep A<----B 返回應答 ack 4.A---->B 傳送結束斷開請求碼sep A<----B 返回應答 ack
TCP對講機服務端開發;
import socket
from datetime import datetime
HOST=''
PORT=8888
ADDRESS=(HOST,PORT)
TS=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
TS.bind(ADDRESS)
TS.listen()
while True:
print('客戶端啟動,等待連結')
client_socket,client_add=TS.accept()
print('連結成功')
msg='歡迎您連結'.encode('gbk')
client_socket.send(msg)
while True:
info=client_socket.recv(1024)
# print(type(info))
print('客戶端資訊:{}'.format(info.decode('gbk')))
infox=str(info).split(' ')[0]+"'"
# print(infox)
# infoy=infox.encode('gbk')
# print(infoy,type(infoy))
if infox ==str(b'bye'):
client_socket.close()
print('客戶端推出')
break
info2=input('服務端輸入資訊:')
infor3=info2.encode('gbk')
a=datetime.now().strftime('%Y{}%m{}%d{} %H:%M:%S').format('年','月','日')
client_socket.send(infor3+' '.encode('utf-8')+a.encode('gbk'))
TS.close()
客戶端開發;
import socket,time
from datetime import datetime
#tcp客戶端模組
HOST='192.168.11.209'
PORT=8888
ADDRESS=(HOST,PORT)
#定義要連結的伺服器物件
tcp_clint=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#連線伺服器
tcp_clint.connect(ADDRESS)
while True:
msg=tcp_clint.recv(1024)
print('服務端資訊:{}'.format(msg.decode('gbk')))
info=input('輸入資訊:')
a = datetime.now().strftime('%Y{}%m{}%d{} %H:%M:%S').format('年', '月', '日')
tcp_clint.send(info.encode('gbk')+' '.encode('utf-8')+a.encode('gbk'))
if info=='bye':
tcp_clint.close()
print('服務端退出')
break