1. 程式人生 > 實用技巧 >tcp與執行緒結合

tcp與執行緒結合

情景:

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()