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