1. 程式人生 > >面向物件程式設計(UDP協議)

面向物件程式設計(UDP協議)

UDP協議

UDP 是User Datagram Protocol的簡稱, 中文名是使用者資料報協議,是OSI(Open System Interconnection,開放式系統互聯) 參考模型中一種無連線的傳輸層協議,提供面向事務的簡單不可靠資訊傳送服務,IETF RFC 768是UDP的正式規範。UDP在IP報文的協議號是17。

服務端

'''
UDP 協議 又稱 資料報協議 SOCK_DGRAM

'''
from socket import *  # 一般不這樣做 會重名 但寫socket可以這樣寫 因為要用到太多 會有大量的socket.

server = socket(AF_INET,SOCK_DGRAM)
server.bind((
'127.0.0.1',8080)) # IP和埠 要繫結 服務端固定的IP埠 # server.listen() # 不需要 掛起的連結數 udp 沒連線 # server.accept() # 不需要 因為udp就沒連線 # while True: # conn,addr = server.accept() # 干連接迴圈的活 while True: data,client_addr = server.recvfrom(1024) print('客戶端資料:',data) # 我要知道誰給我發的 ''' (b'data', ('
127.0.0.1', 51182)) (b'hello', ('127.0.0.1', 51182)) ''' server.sendto(data.upper(),client_addr) server.close()

客戶端

'''
udp 可以發空 資料報協議 說是發空,其實不是空 ,還有一個IP 埠的資訊,發空時 帶個埠資訊
tcp:不是一一對應的
udp:是一一對應的 資料報 完整的
'''
from socket import *  # 一般不這樣做 會重名 但寫socket可以這樣寫 因為要用到太多 會有大量的socket.

client 
= socket(AF_INET,SOCK_DGRAM) # server.bind('127.0.0.1',8080) # IP和埠 要繫結 服務端固定的IP埠 # server.listen() # 不需要 掛起的連結數 udp 沒連線 # server.accept() # 不需要 因為udp就沒連線 # while True: # conn,addr = server.accept() # 干連接迴圈的活 while True: msg = input('>>>:').strip() # udp 可以發空 收到一個空 # if not msg:continue client.sendto(msg.encode('utf-8'),('127.0.0.1',8080)) # 明確的指定發給誰 因為沒有連線了 data,server_addr = client.recvfrom(1024) print('服務端返回的資料:',data,'服務端的地址:',server_addr) server.close()

不會粘包的UDP

服務端

# -*- coding:utf-8 -*-
'''
UDP 協議 又稱 資料報協議 SOCK_DGRAM
sendto recvfrom 一一對應 資料報協議 沒有粘包問題 udp 資料不安全 有可能傳送資料 > 1024 或者網路異常 資料沒了
tcp: 資料一定要可靠
    遠端執行命令
    下載檔案
udp協議:
    QQ
    查詢操作eg:網際網路上 查詢時間  ntp時間伺服器 udp協議 eg:查域名 轉成ip 埠 dns伺服器走的就是udp協議  能保證查詢效率高 資料雖然不可靠
    ntp時間伺服器 dns伺服器 qq 都是udp
'''
# from socket import *  # 一般不這樣做 會重名 但寫socket可以這樣寫 因為要用到太多 會有大量的socket.
#
# server = socket(AF_INET,SOCK_DGRAM)
# server.bind(('127.0.0.1',8080))  # IP和埠 要繫結 服務端固定的IP埠
#
# res1 = server.recvfrom(1024)
# print('第一次:',res1)
# res2 = server.recvfrom(1024)
# print('第二次:',res2)

from socket import *  # 一般不這樣做 會重名 但寫socket可以這樣寫 因為要用到太多 會有大量的socket.

server = socket(AF_INET,SOCK_DGRAM)
server.bind(('127.0.0.1',8080))  # IP和埠 要繫結 服務端固定的IP埠

res1 = server.recvfrom(4)
print('第一次:',res1)
res2 = server.recvfrom(1024)
print('第二次:',res2)

客戶端:

'''
udp 可以發空 資料報協議 說是發空,其實不是空 ,還有一個IP 埠的資訊,發空時 帶個埠資訊
tcp:不是一一對應的
udp:是一一對應的 資料報 完整的額 
'''
# from socket import *  # 一般不這樣做 會重名 但寫socket可以這樣寫 因為要用到太多 會有大量的socket.
#
# client = socket(AF_INET,SOCK_DGRAM)
#
# client.sendto(b'hello',('127.0.0.1',8080))
# client.sendto(b'world',('127.0.0.1',8080))
# client.close()

from socket import *  # 一般不這樣做 會重名 但寫socket可以這樣寫 因為要用到太多 會有大量的socket.

client = socket(AF_INET,SOCK_DGRAM)

client.sendto(b'hello',('127.0.0.1',8080))
client.sendto(b'world',('127.0.0.1',8080))
client.close()

TCP VS UDP

tcp基於連結通訊

  • 基於連結,則需要listen(backlog),指定連線池的大小
  • 基於連結,必須先執行的服務端,然後客戶端發起連結請求
  • 對於mac系統:如果一端斷開了連結,那另外一端的連結也跟著完蛋recv將不會阻塞,收到的是空(解決方法是:服務端在收訊息後加上if判斷,空訊息就break掉通訊迴圈)
  • 對於windows/linux系統:如果一端斷開了連結,那另外一端的連結也跟著完蛋recv將不會阻塞,收到的是空(解決方法是:服務端通訊迴圈內加異常處理,捕捉到異常後就break掉通訊迴圈)
  • 流式協議  會粘包  不可以發空 send recv 不是 一 一對應
  • tcp適用於:
    • 資料一定要可靠
    • 遠端執行命令
    • 下載檔案

udp無連結

  • 無連結,因而無需listen(backlog),更加沒有什麼連線池之說了
  • 無連結,udp的sendto不用管是否有一個正在執行的服務端,可以己端一個勁的發訊息,只不過資料丟失
  • recvfrom收的資料小於sendto傳送的資料時,在mac和linux系統上資料直接丟失,在windows系統上傳送的比接收的大直接報錯
  • 只有sendto傳送資料沒有recvfrom收資料,資料丟失
  • 資料報協議  不會粘包 可以發空 sendto recvfrom 一 一 對應  資料報協議  資料不安全 有可能傳送資料 > 1024 或者網路網路異常 資料沒了
  • udp適用於
    • QQ
    • 查詢操作  eg: ntp時間伺服器  dns伺服器(查域名,轉ip)  能保證查詢效率高,資料雖然不可靠 

 

-------------------------------------------------------------

考核:

socket 通訊 server client
定義一個學生類
元類? 使用元類定義一個物件
粘包
3次握手

封裝 繼承 多型