Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python,服务器上的Muilti线程,分开好,一起不工作_Python_Multithreading_Sockets - Fatal编程技术网

Python,服务器上的Muilti线程,分开好,一起不工作

Python,服务器上的Muilti线程,分开好,一起不工作,python,multithreading,sockets,Python,Multithreading,Sockets,我正在开发一个python程序,其工作原理如下: 有一个服务器和一个客户机通过tcp套接字传输文件,更具体地说,客户机向服务器发送文件请求,服务器将文件发回(如果他有)。 服务器还生成新的RSA密钥对,并按给定的名称命名(通过原始输入获取名称),然后将密钥保存到不同的位置 这是我的服务器代码,我分别测试了这两个函数,它们都运行良好。但是,当我试图通过打开两个线程将它们组合在一起时,什么都没有显示 import sys import socket import os import threadin

我正在开发一个python程序,其工作原理如下: 有一个服务器和一个客户机通过tcp套接字传输文件,更具体地说,客户机向服务器发送文件请求,服务器将文件发回(如果他有)。 服务器还生成新的RSA密钥对,并按给定的名称命名(通过原始输入获取名称),然后将密钥保存到不同的位置

这是我的服务器代码,我分别测试了这两个函数,它们都运行良好。但是,当我试图通过打开两个线程将它们组合在一起时,什么都没有显示

import sys
import socket
import os
import threading

def sendKey(func):
    host = ''
    skServer = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    skServer.bind((host,2525))
    skServer.listen(10)
    print "Server Active"
    bFileFound = 0
    path="/Users/ChunjieXu/Desktop/Publickeys"
    os.chdir(path)

    while True:
        Content,Address = skServer.accept()
        print Address
        sFileName = Content.recv(1024)
        for file in os.listdir(path):
            if file == sFileName:
                bFileFound = 1
                break

        if bFileFound == 0:
            print sFileName+" Not Found On Server"

        else:
            print sFileName+" File Found"
            fUploadFile = open(sFileName,"rb")
            sRead = fUploadFile.read(1024)
            while sRead:
                Content.send(sRead)
                sRead = fUploadFile.read(1024)
            print "Sending Completed"
        break

    Content.close()
    skServer.close()

def genkeys(func):
    while True:
        path="/Users/ChunjieXu/Desktop/Publickeys"
        files=os.listdir(path)

        piname=raw_input('Please enter the Pi Name (5 letters):')

        if piname in files:
            print('Name exists, please enter a new name.')
        else:
            os.chdir('/Users/ChunjieXu/Desktop/Allkeys')
            os.makedirs(piname)
            os.chdir(piname)
            os.system('openssl req -new -x509 -keyout ./cakey.pem -out cacert.pem -days 365')
            os.system('cp cakey.pem cakey.pem.enc')
            os.system('openssl rsa -in ./cakey.pem.enc -out ./cakey.pem')
            os.system('openssl rsa -in ./cakey.pem.enc -passin pass:1234 -pubout -out ./capublickey.pem')
            for old_name in os.listdir('.'):
                prefix=piname
                new_name=prefix+old_name
                os.rename(old_name,new_name)
            for keys in os.listdir('.'):
                result=piname+'capublickey.pem'
                shutil.copy(result,path)


threads=[]
t1=threading.Thread(target=sendKey,)
threads.append(t1)
t2=threading.Thread(target=genkeys,)
threads.append(t2)

if __name__ == '__main__':
    for t in  threads:
        t.setDaemon(True)
        t.start()
    print 'done'
这是我的客户代码:

import sys
import socket 
import os


skClient = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
skClient.connect(("127.0.0.1",2525))

sFileName = raw_input("Enter Filename to download from server : ")
sData = "Temp"
path = "/Users/ChunjieXu/Desktop/Publickeysnode0"
os.chdir(path)

while True:
    skClient.send(sFileName)
    sData = skClient.recv(1024)
    fDownloadFile = open(sFileName,"wb")
    while sData:
        fDownloadFile.write(sData)
        sData = skClient.recv(1024)
    print "Download Completed"
    break

skClient.close()
下面是我执行“pythonserver.py”时的输出

用户$python server.py

完成


我是新手,不太清楚那里发生了什么,有人能帮我吗?欢迎您提供任何建议,我们将不胜感激。非常感谢。

您的程序不会等待线程完成。您正在启动线程,然后您的程序正在打印“完成”,并在线程有机会完成之前退出

要等待线程完成,应该对其调用方法

下面是一个使用主方法的示例:

threads=[] 
t1=threading.Thread(target=sendKey,)
threads.append(t1)
t2=threading.Thread(target=genkeys,)
threads.append(t2)

if __name__ == '__main__':
    for t in  threads:
        t.setDaemon(True)
        t.start()

     for t in threads:
         t.join()

     print 'done'

是的,非常感谢,我修改了它,它第一次工作,然后如果我尝试下载其他文件或生成新密钥,我会遇到其他问题…@jenny徐春杰 查看您发布的代码,似乎在while循环的末尾有
break
语句。当Python执行
break
语句时,它将退出当前所在的任何循环,因此当那些
break
语句存在时,您的程序将只运行一次。@jenny徐春杰 另外,如果您试图创建一个已经存在的目录,
os.makedirs
将抛出一个
OSError