2016-03-02 6 views
0

Python noob здесь. Я пишу простую программу клиент/сервер, где пользователю предлагается ввести имя, имя пользователя, адрес электронной почты, пароль. Эта информация отправляется на сервер, который проверяет, есть ли запись в текстовом файле для этого пользователя. Если есть, он должен отправить сообщение обратно, сказав, что этот пользователь уже существует, попросив пользователя повторить попытку.Python - контур цикла, когда он не должен

Я установил переменную с именем flag в значение False. Я проверяю информацию пользователя относительно текстового файла, и если в файле не найдено совпадения, я устанавливаю флаг в значение true. Тогда у меня есть оператор if, который говорит, что если флаг True, напишите информацию о пользователе в файле.

Однако, когда я ввожу дублирующую информацию, он отправляет обратно соответствующее сообщение «пользователь уже существует», но все равно записывает дублируемую информацию в файл UserProfile.txt. Я продолжаю переписывать свой цикл, а если заявления по-разному видеть, будет ли это иметь значение, но неважно, я ударил по этой же проблеме.

from socket import * 
from datetime import datetime 
#Create a welcome socket bound at serverPort 
serverPort = 12009 
serverSocket = socket(AF_INET,SOCK_STREAM) 
serverSocket.bind(('',serverPort)) 
serverSocket.listen(10) 
print ('The Hello Name server is ready to receive') 
accessTime = datetime.now(); 
print("Access time is", accessTime); 
flag = False 

while 1: 

    while not flag: 
     connectionSocket, addr = serverSocket.accept() 
     #Wait for the hello message 
     sentence1 = connectionSocket.recv(1024) 
     print("From", addr,sentence1.decode('ascii')) 
     #Ask for name if a hello message is received 
     if(sentence1.decode('ascii').upper() == "HELLO"): 
      returnMessage1 = "Please provide the requested information." 
     connectionSocket.send(returnMessage1.encode()) 
     #Wait for the name 
     sentence2 = connectionSocket.recv(1024) 
     fullName = sentence2.decode('ascii') 
     #Wait for the email 
     sentence3 = connectionSocket.recv(1024) 
     email = sentence3.decode('ascii') 
     #Wait for the username 
     sentence4 = connectionSocket.recv(1024) 
     userName = sentence4.decode('ascii') 
     #Wait for the password 
     sentence5 = connectionSocket.recv(1024) 
     password = sentence5.decode('ascii') 



     for line in open("UserProfile.txt").readlines(): 
      if line.find(userName) > -1: #found the username in this record 
       returnMessage3 = "Username already exists, please try again" #reject username 
       connectionSocket.send(returnMessage3.encode()) 
      if line.find(fullName) > -1 and line.find(email) > -1: 
       returnMessage4 = "Account already exists for this person, please try again" #reject email     
      else: 
       flag = True 

    if flag:    

     #Prepare the access record with information separated by tab key 
     userAccount = userName+"\t"+password+"\t"+fullName+"\t"+email+"\n" 
     #Append the access record into accessRecord.txt 
     output_file = open("UserProfile.txt", "a") 
     output_file.write(userAccount) 
     output_file.close() 
     #Respond the client with the access information 
     returnMessage2 = "Registration Successful" 
     connectionSocket.send(returnMessage2.encode()) 

    connectionSocket.close()    #Close the connection 
+0

Пожалуйста перепроверить/исправить отступы. Ваши вложенные петли 'while' синтаксически недействительны, и это заставляет меня сомневаться в остальной части отступа. – ShadowRanger

+0

Должно быть исправлено. – sam

ответ

1

Когда вы обнаружите, что имя пользователя уже существует, вы отправляете ответ, но вы не останавливаетесь.

Попробуйте положить break в вашем блоке, если:

for line 
    if user name in line 
     send message about already exists 
     break - out of for loop 
+0

Это исправлено! Думаю, я должен признать, что я не совсем уверен, почему. Если цикл не был нарушен, флаг flag еще не был бы установлен на False? Почему оператор Else: который устанавливает его в true, все еще выполняется из первого оператора if? – sam

+0

Это было бы, но что произойдет, когда выполняется оператор NEXT if? Полное имя не найдено, флаг ELSE = true! –

+0

Ах, имеет смысл. Спасибо! Я соглашусь, когда это позволит мне. – sam

Смежные вопросы