Python,服务器上的多线程,分开很好,一起n

2024-09-29 23:30:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个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()

这是我执行“python server.py”时的输出

user$ python server.py

done

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


Tags: pathnameinimportossocketpemprint
1条回答
网友
1楼 · 发布于 2024-09-29 23:30:22

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

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

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

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'

相关问题 更多 >

    热门问题