tcp與執行緒結合
阿新 • • 發佈:2020-07-11
情景:
1.利用tcp實現服務端對客戶端傳遞檔案(圖片)(接前文);
2.利用執行緒實現視覺上兩個客戶端同時向客戶端傳遞檔案(圖片);
服務端
from socket import * import datetime from multiprocessing import * def server(): server_img=socket(AF_INET,SOCK_STREAM) server_img.bind(('0.0.0.0',9999)) server_img.listen(5) while True: print("等待連線") connfd,addr=server_img.accept() print("CNNENT FROM:",addr) print('寫入圖片') with open(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')+'.jpg','wb+') as wimg: while True: data = connfd.recv(1024) if not data:break wimg.write(data) connfd.close() server_img.close() #建立執行緒 server_process=Process(target=server) #啟動執行緒 server_process.start() #結束執行緒 server_process.join()
客戶端:
from socket import * import multiprocessing import time import os def conect(ip,host,url): #建立套接字connect_img=socket() #建立連線 connect_img.connect((ip,host)) #讀取檔案 with open(url,'rb') as rimg: img=rimg.read() #傳送文 connect_img.send(img) #關閉套接字 connect_img.close() #在wds和mac系統下必須用main包裹程序否則報錯(這與系統差異有關) if __name__ == '__main__': #建立程序p,p2 並傳出引數方法一 p=multiprocessing.Process(target=conect,args=('127.0.0.1',9999,'1.JPG')) #傳參方法二 p2=multiprocessing.Process(target=conect,kwargs={'ip':'127.0.0.1','host':9999,'url':'2.JPG'}) #啟動程序 p.start() print("程序1") #程序名 print(p.name) #程序號 print(p.pid) #間隔時間 time.sleep(5) #雖然執行緒啟動了但是並不是立即就有訊息因為TCP協議本身並不能同時處理多個訊息 #只有執行緒1徹底的connfd.clase執行完後,結束了套接字才能從訊息佇列裡對接執行緒二的訊息 p2.start() print('程序2') #結束程序 p.join() p2.join()