2016-12-04 9 views
0

私はPythonファイルサーバーを作りましたが、ちょっと前に戻ってきました。これは非常に単純なプログラムですが、私はいくつかの機能を追加したいと思っています。このため、私はハッシュ化されたログインパスワードを作成し、それをサーバコンピュータに保存された.txtファイルに入れました。プログラムの動作方法は、クライアントがサーバーに接続するたびにパスワードを入力する必要があります。 raw_entryは、ソケットを介して送信され、正しい場合はサーバ側でチェックされます。そうでない場合、ユーザはパスワードを2回以上入力しようとします。何らかの理由でこれは機能しません。Python File Server、ログイン機能が動作しません

サーバー:

from passlib.hash import pbkdf2_sha256 
import socket 
import threading 
import os 

def login(): 
    loop = 1 
    while loop <= 3: 
     passwd = sock.recv(1024)  
     with open('passtor.txt', 'r') as f: 
      hash = f.read() 
      if pbkdf2_sha256.verify(passwd, hash): 
       s.send("Access Granted") 
       loop = 4 
      else: 
       s.send("Verification Failure") 
       loop += 1 
       if loop == 3: 
        sock.close() 

def RetrFile(name, sock): 
    filename = sock.recv(1024) 
    if os.path.isfile(filename): 
     sock.send("EXISTS " + str(os.path.getsize(filename))) 
     userResponse = sock.recv(1024) 
     if userResponse[:2] == 'OK': 
      with open(filename, 'rb') as f: 
       bytesToSend = f.read(1024) 
       sock.send(bytesToSend) 
       while bytesToSend != "": 
        bytesToSend = f.read(1024) 
        sock.send(bytesToSend) 
    else: 
     sock.send("ERR ") 

    sock.close() 

try: 
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    #s.connect(('google.com', 0)) 
    host = s.getsockname()[0] 
    port = 5000 

    s = socket.socket() 
    s.bind((host,port)) 
    s.listen(5) 

    print "File Server Initiated" 
    print("Server Address-> " + host + " <-") 



    while True: 
     c, addr = s.accept() 
     print "Client Connected ip-> " + str(addr) + " <-" 
     t1 = threading.Thread(target=login, args=("RetrThread", c)) 
     t2 = threading.Thread(target=RetrFile, args=("RetrThread", c)) 
     t1.start() 
     t2.start() 

    s.close() 
except: 
    print("Program Error, \nTermination Complete") 

クライアント:

import socket 


host = '127.0.0.1' 
port = 5000 

s = socket.socket() 
s.connect((host, port)) 

loop = True 
while loop == True: 
    passwd = raw_input("Admin Password-> ") 
    s.send(passwd) 
    answer = s.recv(1024) 
    if answer == 'Verification Failure': 
     loop = True 
     print(answer) 
    elif answer == 'Access Granted': 
     loop = False 
     print(answer) 


filename = raw_input("Filename? -> ") 
if filename != 'q': 
    s.send(filename) 
    data = s.recv(1024) 
    if data[:6] == 'EXISTS': 
     filesize = long(data[6:]) 
     message = raw_input("File exists, " + str(filesize) +"Bytes, download? (Y/N)? -> ") 
     if message == 'Y': 
     s.send("OK") 
     f = open('new_'+filename, 'wb') 
     data = s.recv(1024) 
     totalRecv = len(data) 
     f.write(data) 
     while totalRecv < filesize: 
      data = s.recv(1024) 
      totalRecv += len(data) 
      f.write(data) 
      print "{0:.2f}".format((totalRecv/float(filesize))*100)+ "% Done" 
     print "Download Complete!" 
     f.close() 
else: 
    print "File Does Not Exist!" 

s.close() 
+0

クライアントが接続するときにエラーメッセージを追加するのを忘れました。スレッド1の例外Thre​​ad-1: トレースバック(最新の呼び出し最後): ファイル "/usr/lib/python2.7/threading。 py "、line 801、__ bootstrap_inner self.run() ファイル" /usr/lib/python2.7/threading.py "、行754、実行中 self .__ target(* self .__ args、** self。 TypeError例外__kwargs):それはこの 'デフログイン(*引数)のように見えるので、ログイン()2が与えられた(引数を取らない) – Nicholas

+0

は、ログイン機能に*引数を追加します。私は中にエラーが出る理由' –

答えて

0

あなたはここでログイン機能に二つの引数を渡しています

t1 = threading.Thread(target=login, args=("RetrThread", c)) 

彼らが関数宣言で宣言されていません:

def login(): 

threading.Threadの呼び出しからargsパラメータを削除するか、引数を関数宣言に追加します。

+0

は誰もが知っていますログイン機能? s.send( "アクセス許可") エラー:[Errno 32]壊れたパイプ – Nicholas

関連する問題