zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    [转]lftp的致命错误:证书验证:不信任
    github每次push都需要密码以及用户名的解决办法
    Fedora最小化安装后没有ifconfig命令
    [转载]MySql常用命令总结
    chrome浏览器强制采用https加密链接
    红帽系列linux自行配置本地yum源
    linux 下dd命令直接清除分区表(不用再fdisk一个一个的删除啦)
    linux分区工具fdisk的使用
    Java多线程实现......(1,继承Thread类)
    第一篇文章--我为什么要写博客?
  • 原文地址:https://www.cnblogs.com/yongqi-wang/p/13284828.html
Copyright © 2011-2022 走看看