私は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()
クライアントが接続するときにエラーメッセージを追加するのを忘れました。スレッド1の例外Thread-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
は、ログイン機能に*引数を追加します。私は中にエラーが出る理由' –