python课程思路_学习python课程第二十六天
一.? ? 傳輸層
在上述三層協議中我們,ip協議幫我們定位到子網絡. mac地址幫我們定位到一臺計算機,并與其通訊,
但本質上,計算機的通訊是為了應用程序能夠通訊,而一臺計算機上不可能運行一個應用程序
問題:
就像我們同時運行QQ軟件和微信軟件, 當計算機收到一個數據包時, 需要知道這個數據包到底是給
哪個應用程序的.
解決方案:
為每一個應用程序綁定一個端口號,? 端口號就是一個數字, 取值范圍為 0 -- 65536 其中 0 -- 1023是
系統保留的
再次捋清思路:
端口定位應用程序, ip 定位網絡, mac 定位計算機
可以通過這三個地址,找到全世界計算機中唯一的一個應用程序, 使我們編寫網絡應用程序成為可能.
傳輸層協議 :
為什么要有傳輸層協議 ?
應用程序可相互傳遞數據了, 還記得在ip協議中有一個路由算法么? 會自動選擇最佳的傳輸路徑,
將導致你的數據包可能走了不同的路線, 造成接受順序錯亂, 以及發生丟包等, 為了保證數據傳輸的
完整性, 誕生了傳輸層協議!
TCP :基于鏈接傳輸數據, 可保證數據傳輸的完整性
優點 :通過三次握手來與服務器建立連接
可以保證數據的完整性.
a機器給b機器發送數據包, 要求b機器必須立即返回一個確認包,
a機器會等待一段時間,如果超時還沒有收到確認, 則重發數據.
缺點:
傳輸效率低.
使用場景 :? 文字聊天. 支付寶轉賬等,
UDP : 不需要建立連接,直接發送
缺點:
不能保證數據的完整性
優點:
傳輸效率比TCP高很多
使用場景 :? 視頻通話,語音通話, 游戲等.
socket 是什么?
Socket是應用層與TCP/IP協議族通信的中間軟件抽象層,它是一組接口。在設計模式中,
Socket其實就是一個門面模式,它把復雜的TCP/IP協議族隱藏在Socket接口后面,對用戶來說,
一組簡單的接口就是全部,讓Socket去組織數據,以符合指定的協議。
所以,我們無需深入理解tcp/udp協議,socket已經為我們封裝好了,我們只需要遵循socket的
規定去編程,寫出的程序自然就是遵循tcp/udp標準的。
使用 socket:
在使用socket的時候用戶需要關心的是, ip地址, port端口. 傳輸協議TCP/UDP,你要發送的數據data
在寫網絡編程的時候,必然是兩臺代碼, 對應著客戶端和服務器.
socket 的工作流程 :
一個生活中的場景。你要打電話給一個朋友,先撥號,朋友聽到電話鈴聲后提起電話,
這時你和你的朋友就建立起了連接,就可以講話了。等交流結束,掛斷電話結束此次交談。
生活中的場景就解釋了這工作原理。
先從服務器端說起。服務器端先初始化Socket,然后與端口綁定(bind),對端口進行監聽(listen),
調用accept阻塞,等待客戶端連接。在這時如果有個客戶端初始化一個Socket,然后連接服務器
(connect),如果連接成功,這時客戶端與服務器端的連接就建立了。客戶端發送數據請求,
服務器端接收請求并處理請求,然后把回應數據發送給客戶端,客戶端讀取數據,最后關閉
連接,一次交互結束
服務端套接字函數
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() 創建一個與該套接字相關的文件
使用socket來完成TCP通訊
應該先完成服務器的代碼編寫
TCP 服務器 :
import? socket
# 1. 先創建一個代表服務器的socket對象
s = socket.socket()
# 2.? 綁定ip地址與 端口號
# 127.0.0.1? 表示當前電腦的ip
address = ('127.0.0.1',8090)? ? ? ? ? #傳入ip與端口
s.bind((address))
print ('服務器已啟動')
#? 3. 開始監聽這個端口
#? 參數5 表示可以有五個處于半連接狀態的連接.(不是控制最大連接數的參數.)
s.listen(5)
# 4. 接受連接請求
# 該函數是阻塞的. 會卡主程序的執行,必須等到有一個客戶端進來才會繼續執行.
它會返回一個元組, 第一個代表客戶端的socket對象, 第二個是客戶端的端口
client,c_address = s.accept()
print('有一個連接已建立')
# 5.讀寫數據
# 接受數據 , 參數1024是需要接受的字節數
res = client.recv(1024)
print(res)
# 6. 關閉連接
s.close()? ? (一般不會關閉服務器.都是關閉客戶端)
TCP 客戶端:
import? socket
# 1. 創建客戶端的socket對象
c = socket.socket()
# 2. 連接到服務器
server_address = ('127.0.0.1',8080)? ? # 端口必須跟服務器一樣
# 3.建立連接
c.connect(server_address)
# 4.讀寫數據
# 發送數據到服務器
c.send('hello 我是客戶端')
# 5. 關閉連接
c.close()
使用socket來完成UDP通訊,一樣是先創建服務端
UDP 服務端:
import? socket
# 1.創建socket對象
# 必須自己定義參數
s = socket.socket(type = socket.SOCK_DGRAM)
# 2. 綁定端口和ip
s.bind(('127.0.0.1',10000))
# 3. 接受數據. 接受數據的時候,沒有客戶端來連接,也會卡主,等待客戶端來連接了.再正常運行程序
res = s.recv(1024)
print(res)
# 4.
UDP? 客戶端 :
import? socket
# 1. 創建客戶端
c = socket.socket(type = socket.SOCK_DGRAM)
# 不需要連接, 可以直接發送數據,只需要知道對方的ip和端口即可.
c.sendto('這是UDP的客戶端'.encode('utf-8'),(127.0.0.1,10000))
# 關閉客戶端
c.close()
總結
以上是生活随笔為你收集整理的python课程思路_学习python课程第二十六天的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python作业题目用户输入行数、输出倒
- 下一篇: python distplot 图_Py