1. 程式人生 > 其它 >網路程式設計與網路併發

網路程式設計與網路併發

  • UDP協議

  • UDP協議實戰

  • 作業系統的發展史

  • 多道技術

  • 程序理論

 

編寫一個從從客戶端上傳視訊的CS架構軟體

客戶端
import socket
import os
import json
import struct
​
client = socket.socket()
client.connect(('127.0.0.1', 8080))
​
movie_dir_path = r'C:\Users\10985\Desktop\SP\python基礎day01\視訊'
while True:
    # 1.迴圈展示出需要上傳的電影列表
    movie_name_list = os.listdir(movie_dir_path)
    
for i, movie_name in enumerate(movie_name_list, start=1): print(i, movie_name) choice = input('請選擇您想要上傳的電影編號>>>:').strip() if not choice.isdigit(): continue choice = int(choice) if choice not in range(1, len(movie_name_list) + 1): print('請輸入正確的編號')
continue# 2.獲取電影名字 target_movie_name = movie_name_list[choice - 1] # 3.拼接電影路徑 movie_path = os.path.join(movie_dir_path, target_movie_name) # 4.製作字典資料 movie_dict = { 'file_name': target_movie_name, 'file_desc': '少看點', 'file_size': os.path.getsize(movie_path) } movie_dict_json
= json.dumps(movie_dict) movie_dict_len = len(movie_dict_json.encode('utf8')) # 5.製作字典報頭 dict_header = struct.pack('i', movie_dict_len) # 6.傳送字典報頭 client.send(dict_header) # 7.傳送字典資料 client.send(movie_dict_json.encode('utf8')) # 8.傳送真實資料 with open(movie_path,'rb') as f: for line in f: client.send(line)

 

 
           
服務端
import struct
import json
import socket
​
server = socket.socket()
server.bind(('127.0.0.1',8080))
server.listen(5)
​
sock, addr = server.accept()
# 接收固定長度的報頭
header = sock.recv(4)
# 接收字典的長度
dict_len = struct.unpack('i',header)[0]
# 接收字典資料
dict_bytes = sock.recv('file_size')
dict_data = json.loads(dict_bytes)
# 接收真實資料
recv_size = 0
total_size = dict_data.get('file_size')
file_name = dict_data.get('file_name')
# 檔案操作
with open(file_name,'wb') as f:
    while recv_size < total_size:
        data = sock.recv(1024)
        f.write(data)
        recv_size += len(data)

 

 

 

UDP協議

客戶端
import socket
client = socket.socket(type=socket.SOCK_DGRAM)
server_addr = ('127.0.0.1', 8080)  # 查詢通訊錄
client.sendto(b'hello server baby', server_addr)
msg, addr = client.recvfrom(1024)
print('msg>>>:', msg.decode('utf8'))
print('addr>>>:', addr)

 

 


服務端
import socket
server = socket.socket(type=socket.SOCK_DGRAM)  # 自己指定UDP協議(預設是TCP協議)
server.bind(('127.0.0.1', 8080))
msg, addr = server.recvfrom(1024)
print('msg>>>:', msg.decode('utf8'))
print('addr>>>:', addr)
server.sendto(b'hello baby', addr)

 

 

 

基於UDP實現簡易版的qq

客戶端
import socket
​
client = socket.socket(type=socket.SOCK_DGRAM)
server_addr = ('127.0.0.1', 8080)
​
while True:
    msg = input('請輸入想要聊天的內容>>>:').strip()
    msg = '來自客戶端的訊息:%s' % msg
    client.sendto(msg.encode('utf8'), server_addr)
    msg, addr = client.recvfrom(1024)
    print(msg.decode('utf8'), addr)

 

 

 


 
服務端
import socket
​
server = socket.socket(type=socket.SOCK_DGRAM)
server.bind(('127.0.0.1', 8080))
while True:
    msg, addr = server.recvfrom(1024)
    print(addr)
    print(msg.decode('utf8'))
    back_msg = input('請回復訊息>>>:').strip()
    server.sendto(back_msg.encode('utf8'), addr)

 

 

 

 

作業系統的發展史

"""
學習併發程式設計其實就是在學習作業系統 理論居多 實戰少 都是封裝的程式碼
"""

1.穿孔卡片
優勢:一個人獨佔電腦
   劣勢:CUP利用率極低
2.聯機批處理系統
一次性可以錄入多個指令、縮短了cpu等待的時間、提高了CPU的利用率

3.離線處理系統
是現代計算機核心部件的雛形、提高CPU的利用率
 
總結:作業系統的發展史其實就是提高CPU利用率的過程

多道技術

目的:提升CPU技術利用率 降低程式等待時間
'''強調:目前我們研究併發都是以計算機是單核的情況下:只有一個CPU'''
序列
多個任務排隊執行 總耗時就是多個任務完整時間疊加
多道
利用空閒提前準備 縮短總的執行時間並且還能提高CPU利用率
 
"""
多道技術
1.空間上的複用
多個任務公用一套計算機硬體

2.時間上的服用
切換+儲存狀態
CPU在兩種情況下會被拿走
1.程式遇到IO操作 CPU自動切走執行其他程式
2.程式長時間佔用CPU 系統發現之後也會強行切走CPU 保證其他程式也可以使用
"""
例:
開房需要10min
   玩遊戲需要180min
   洗澡需要20min
 序列總共需要耗時:10min + 180min + 20min
 多道總共需要耗時:180min

 

程序理論

什麼是程式、什麼是程序
程式:一堆沒有被執行的程式碼(死的)
   程序:正在執行的程式(活的)
 
為什麼有程序的概念
就是為了更加精確的描述出一些實際狀態
 
程序排程演算法發展史
1.先來先服務
  對短作業任務不太友好
   2.短作業優先
  對長作業任務不太友好
   3.時間片輪轉法與多級反饋佇列
  時間片輪轉法:先公平的將CPU分給每個人執行
       多級反饋佇列:根據作業長短的不同再合理分配CPU執行時間
   '''目的就是為了能夠讓單核的計算機也能夠做到執行多個程式'''

重要概念

# 併發與並行
併發
   看上去像同時在執行就可以稱之為是併發
   """
  飯店裡邊有很多桌客人(任務)
  但是隻有一個服務員(CPU)
  如果讓所有客人都感覺被服務員服務著(CPU執行)
  讓服務員在多桌客人之間快速的來回切換並儲存狀態即可
  讓CPU在多個程式之間利用多道技術來回切換+儲存狀態
 
  單核肯定能夠實現併發 但是不能實現並行
  """
   並行
  必須同一時間同時執行才可以稱之為並行
       """單核計算機肯定不能實現並行 必須要有多個CPU"""
     
# 高併發與高並行
高併發:我們寫的軟體可以支援一個億的併發量
  一個億的使用者來了之後都可以感覺到自己被服務著
   高並行:我們寫的軟體可以支援一個億的並行量
  上述話語的言外之意是計算機有一億個CPU
   
# 同步與非同步
同步
  提交完任務之後原地等待任務的返回結果 期間不做任何事情
   非同步
  提交完任務之後不願等待任務的結果 直接去做其他事情 有結果自動提醒
     
# 阻塞與非阻塞
程序三狀態圖
   就緒態:程式進入執行態之前肯定要處於就緒態
   執行態:程式被CPU執行著
   阻塞態:程式執行過程中有IO操作
   '''
  如果想要儘可能的提升程式執行效率
  就要想辦法讓我們的程式一直處於就緒態和執行態(不要有IO操作)
  '''
   阻塞:阻塞態
   非阻塞:就緒態、執行態
   

同步非同步與阻塞非阻塞結合

同步非同步:用來描述任務的提交方式
阻塞與非阻塞:用來描述任務的執行狀態

上述兩組屬於兩個不同概念 但是可以結合
同步阻塞:銀行排隊辦理業務 期間不做任何事
   同步非阻塞:銀行排隊辦業務 期間喝水吃東西 但是人還在佇列中
   非同步阻塞:在椅子上坐著 但是不做任何事
   非同步非阻塞:在椅子上坐著 期間喝水吃東西辦公 (程式執行的極致)