1、網絡編程的計劃:編程
一、socket 編程緩存
二、併發編程服務器
多進程網絡
多線程多線程
協程架構
IO模型併發
socketserversocket
三、MySQL數據tcp
2、內容學習:ide
一、客戶端\服務器架構
(1)服務端和客戶端之間基於網絡的通訊叫作CS架構
(2)服務端具有的特色:
#基於網絡通訊
#一直對外提供服務
#服務端應該支持併發
二、互聯網協議是計算機界的標準
互聯網協議的功能:定義計算機如何接入internet,以及接入internet的計算機通訊的標準。
計算機(硬件)->os(操做系統)->應用軟件
三、osi七層協議
四、tcp\ip五層模型講解
(1)物理層功能:主要是基於電器特性發送高低電壓(電信號),高電壓對應數字1,低電壓對應數字0
(2)數據鏈路層:
數據鏈路層由來:單純的電信號0和1沒有任何意義,必須規定電信號多少位一組,每組什麼意思
數據鏈路層的功能:定義了電信號的分組方式
(3)網絡層:
#IP地址+mac地址標識全世界範圍內獨一無二的機器
#ip地址+mac地址+端口標識 全世界範圍獨一無二的軟件
服務器的IP 端口地址是捆綁式固定的,不能改變
網絡層的ip幫咱們區分子網,以太網層的mac幫咱們找到主機
(4)傳輸層:
傳輸層功能:創建端口到端口的通訊
補充:端口範圍0-65535,0-1023爲系統佔用端口
(5)應用層:
應用層功能:規定應用程序的數據格式。
#應用軟件產生數據——操做系統(tcp/udp協議封包、IP地址打包、以太網打包)——
物理層(高低電平)傳輸——接收 拆包。。。。。
五、socket
Socket是應用層與TCP/IP協議族通訊的中間軟件抽象層,它是一組接口。
ip與port的綁定就標識了互聯網中獨一無二的一個應用程序
六、套接字
七、套接字的工做流程:
八、socket()的模塊函數用法
1 import socket 2 socket.socket(socket_family,socket_type,protocal=0) 3 socket_family 能夠是 AF_UNIX 或 AF_INET。socket_type 能夠是 SOCK_STREAM
或 SOCK_DGRAM。protocol 通常不填,默認值爲 0。 4 5 獲取tcp/ip套接字 6 tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 7 8 獲取udp/ip套接字 9 udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 10 11 因爲 socket 模塊中有太多的屬性。咱們在這裏破例使用了'from module import *'語句。
使用 'from socket import *',咱們就把 socket 模塊裏的全部屬性都帶到咱們的命名空間裏了,
這樣能 大幅減短咱們的代碼。 12 例如tcpSock = socket(AF_INET, SOCK_STREAM)
服務端套接字函數
s.bind() 綁定(主機,端口號)到套接字
s.listen() 開始TCP監聽
s.accept() 被動接受TCP客戶的鏈接,(阻塞式)等待鏈接的到來
客戶端套接字函數
s.connect() 主動初始化TCP服務器鏈接
s.connect_ex() connect()函數的擴展版本,出錯時返回出錯碼,而不是拋出異常
公共用途的套接字函數
s.recv() 接收TCP數據
s.send() 發送TCP數據(send在待發送數據量大於己端緩存區剩餘空間時,數據丟失,不會發完)
s.sendall() 發送完整的TCP數據(本質就是循環調用send,sendall在待發送數據量大於己端緩存區剩餘空間時,數據不丟失,循環調用send直到發完)
s.recvfrom() 接收UDP數據
s.sendto() 發送UDP數據
s.getpeername() 鏈接到當前套接字的遠端的地址
s.getsockname() 當前套接字的地址
s.getsockopt() 返回指定套接字的參數
s.setsockopt() 設置指定套接字的參數
s.close() 關閉套接字
面向鎖的套接字方法
s.setblocking() 設置套接字的阻塞與非阻塞模式
s.settimeout() 設置阻塞套接字操做的超時時間
s.gettimeout() 獲得阻塞套接字操做的超時時間
面向文件的套接字的函數
s.fileno() 套接字的文件描述符
s.makefile() 建立一個與該套接字相關的文件
例子:簡單的套字節通訊
import socket #一、先買手機 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #指的是TCP協議 # 二、綁定電話卡 phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) phone.bind(("127.0.0.1",8079)) #s.bind() 綁定(主機,端口號)到套接字 #三、開機 phone.listen(5) #s.listen() 開始TCP監聽 #四、等電話 print("starting....") conn,addr=phone.accept() #s.accept() 被動接受TCP客戶的鏈接,(阻塞式)等待鏈接的到來 print(conn) print(addr) #五、發收消息 data=conn.recv(1024) #s.recv() 接收TCP數據 conn.send(data.upper()) #s.send() 發送TCP數據(send在待發送數據量大於己端緩存區剩餘空間時,數據丟失,不會發完) # 六、掛電話 conn.close() #s.close() 關閉套接字 # 七、關機 phone.close()
import socket #一、先買手機 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #二、打電話 phone.connect(("127.0.0.1",8079)) #cnnect 主動出示化TCP服務器鏈接 #三、發收消息 phone.send("hello world".encode("utf_8")) #s.send() 發送TCP數據(send在待發送數據量大於己端緩存區剩餘空間時,數據丟失,不會發完) data=phone.recv(1024) #接收TCP數據 print(data.decode("utf-8")) #四、關閉 phone.close() #s.close() 關閉套接字
循環:
import socket #一、先買手機 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #指的是TCP協議 # 二、綁定電話卡 phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) phone.bind(("127.0.0.1",8070)) #s.bind() 綁定(主機,端口號)到套接字 #三、開機 phone.listen(5) #s.listen() 開始TCP監聽 #四、等電話 print("starting....") conn,addr=phone.accept() #五、發收消息 while True:#通訊循環 data=conn.recv(1024) #s.recv() 接收TCP數據 conn.send(data.upper()) #s.send() 發送TCP數據(send在待發送數據量大於己端緩存區剩餘空間時,數據丟失,不會發完) # 六、掛電話 conn.close() #s.close() 關閉套接字 # 七、關機 phone.close()
import socket #一、先買手機 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #二、打電話 phone.connect(("127.0.0.1",8070)) #cnnect 主動出示化TCP服務器鏈接 #三、發收消息 while True: msg=input(">>: ").strip() if not msg:continue phone.send(msg.encode("utf_8")) #s.send() 發送TCP數據(send在待發送數據量大於己端緩存區剩餘空間時,數據丟失,不會發完) data=phone.recv(1024) #接收TCP數據 print(data.decode("utf-8")) #四、關閉 phone.close() #s.close() 關閉套接字
保持服務器一直對外提供服務
import socket #一、先買手機 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #指的是TCP協議 # 二、綁定電話卡 phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) phone.bind(("127.0.0.1",8071)) #s.bind() 綁定(主機,端口號)到套接字 #三、開機 phone.listen(5) #s.listen() 開始TCP監聽 #四、等電話 print("starting....") while True: #連接循環 conn,addr=phone.accept() #s.accept() 被動接受TCP客戶的鏈接,(阻塞式)等待鏈接的到來 print(addr) #五、發收消息 while True:#通訊循環 try: data=conn.recv(1024) #s.recv() 接收TCP數據 conn.send(data.upper()) #s.send() 發送TCP數據(send在待發送數據量大於己端緩存區剩餘空間時,數據丟失,不會發完) except ConnectionAbortedError: break # 六、掛電話 conn.close() #s.close() 關閉套接字 # 七、關機 phone.close()