2017-06-16 11 views
0

私は次のように動作するPythonプログラムを開発中です: サーバとクライアントがtcpソケットでファイルを転送するクライアントがあります。サーバーとサーバーへのファイル要求は、ファイルがあれば元に戻します。 サーバーはまた、新しいRSAキーペアを生成し、指定された名前で名前を付けます(raw-inputで名前を取得します)、キーを別の場所に保存します。Python、サーバ上のMuiltiスレッド、別々の細かい、一緒に動作しない

私のサーバーのコードは、私は別々に2つの機能をテストしましたが、どちらもうまく動作します。しかし、私は2つのスレッドを開いてそれらを一緒にしようとすると、何も表示されません。

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' 

は、ここでは、クライアントの私のコードです:私は 'のpython server.py'

ユーザー$パイソンserver.py

行わ

を行う際

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

は、ここに出力です

私はスレッドに新しく、そこに何が起こっているのか非常に明確ではない、誰もそれを手伝ってくれる?あらゆるヒントは歓迎され、感謝していますどうもありがとうございます。

答えて

0

スレッドが終了するまでプログラムは待機しません。あなたはスレッドを開始しています。そして、あなたのプログラムは「完了」を印刷し、終了する前に終了します。

スレッドが終了するのを待つには、joinメソッドを呼び出す必要があります。ここで

があなたの主なメソッドを使った例です:

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' 
+0

はい、どうもありがとうございました、私はそれを修正し、それが最初の時間のために働いた、そして私は他のファイルをダウンロードしたり、新しいキーを生成しようとした場合、私は他の問題を持っています..... –

+0

@jenny徐春杰投稿したコードを見ると、whileループの最後に 'break'ステートメントがあるようです。 Pythonが 'break'ステートメントを実行すると、現在のループから抜けるため、プログラムは' break'ステートメントがある間に一度だけ実行されます。 – RoboKincaid

+0

@jenny徐春もまた、すでに存在するディレクトリを作成しようとすると、 'os.makedirs'は' OSError'をスローします。 – RoboKincaid

関連する問題