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

 

你可能感兴趣的:(tcp与线程结合)