2014-02-19 3 views
0

У меня проблема с одним из моих университетских проектов. Мы делаем сокеты и UDP на данный момент. В любом случае, нам нужно было сделать очень простую проверку, проверку сервера, клиента, пароля. Он хотел, чтобы мы сделали журнал событий, и я создал модуль с методами для записи в файл журнала, это отлично работает. Я называл это из разных мест, и он всегда работает. Единственный раз, когда он не работает, вызывается с сервера.Создание журнала для соединения UDP

import datetime 

###Appends the message to the server log with the current date and time 
def AddToLogServer(message): 
    f = open('Log_Server', 'a') 

    time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") 
    f.write(time +" " + message +"\n") 
    f.close() 

###Appends the message to the client log with the current date and time 
def AddToLogClient(message): 
    f = open('Log_Client', 'a') 

    time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") 
    f.write(time +" " + message +"\n") 
    f.close() 

Это творения журнала. Работает отлично.

import socket 
import sys 
import Passwords 
import getpass 
import Log 
###Create a connectionless network socket. 
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
###Maximum size data. 
MAX = 65535 
PORT = 1060 

if sys.argv[1:] == ['server']: 
    ###Set server ip 
    ip = '127.0.0.1' 
    try: 
     s.bind((ip, PORT)) 
    except: 
     ###If the server fails to start this error message and the server should end. 
     print "There is an error, perhaps the ip is already being used." 
     s.close() 
     sys.exit(1) 
    ###Add to the server log that the server has started. 
    Log.AddToLogServer("The server is up with the ip " + ip) 
    print 'Server is up and listening at', s.getsockname() 
    ###Listen for a client to send data to the server. 
    while True: 
     data, address = s.recvfrom(MAX) 
     Passwords.getPasswordsAndUsers() 
     ###Compare the name inputted to the ones in the user list 
     i = Passwords.findUser(data) 
     ###Update client log 
     Log.AddToLogServer(address[0] + " Inputted the name " + data) 
     s.sendto(str(i), address) 
     data, address = s.recvfrom(MAX) 
     t = Passwords.checkPassword(data,i) 
     ###if the password matched the user print out the correct message and send a message to the client 
     if t == 1: 
      Log.AddToLogServer(address[0] + " Inputted the correct password for that user") 
      print address[0] + " Has successfully entered the correct User and Password" 
      s.sendto("The name and password were correct", address) 
     ###if the password did not match the user print out the correct message and send a message to the client 
     else: 
      Log.AddToLogServer(address[0] + " Inputted an incorrect password for that user") 
      print address[0] + " Has failed to provide the correct Password for the inputted User" 
      s.sendto("The password did not match the name", address) 


elif sys.argv[1:] == ['client']: 
    ###Takes in the ip and name as inputs. 
    serverIp = raw_input("Please enter the server ip : "); 
    username = raw_input("Enter your first name please: "); 
    ### Attempts to send to the server with the given ip 
    try: 
     s.sendto(username, (serverIp, PORT)) 
    except: 
     ###If the send fails then an error is shown and it finishes the execution. 
     print "There was a problem sending to the server" 
     s.close() 
     sys.exit(1) 
    ###Attempt to relieve data from the server, if the client does not then write the appropriate message. 
    try: 
     data, address = s.recvfrom(MAX) 
    except: 
     print "There was a problem receiving from the server" 

     s.close() 
     sys.exit(1) 
    data = int(data) 
    ###If the data was -1, then the user did not exist and an error should be displayed. Otherwise ask for the 
    ###Password and send it to the server. 
    if data != -1: 
     password = getpass.getpass("Enter your password please: "); 
     try: 
      s.sendto(password, ('127.0.0.1', PORT)) 
     except: 
      print "There was a problem sending to the server" 
      s.close() 
      sys.exit(1) 
    else: 
     print "This first name was not recognised." 
     sys.exit(1) 
    ###Again try to relieve data from the server and print out the output. 
    try: 
     data, address = s.recvfrom(MAX) 
     print data 
     s.close() 

    except: 
     print "There was a problem receiving to the server" 
     s.close() 
     sys.exit(1) 

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

+0

Вы используете как клиент, так и сервер на той же машине, используя тот же порт? – thebjorn

+0

Да. Программа работает нормально, только журнал не работает. – user1817988

+0

Распечатайте serverIp и PORT перед тем, как вы выполните ss.sendto (имя пользователя, (serverIp, PORT)) '... – thebjorn

ответ

0

Я попытался воспроизвести проблему, но сценарий для сервера не выполнялся. На моей машине sys.argv[1:] вернулся [], поэтому я изменил эту часть вашего скрипта if sys.argv[1:] == ['server']: до if sys.argv[1:] == []: См. Ответ, который я получил. Вы должны изучить эту часть. if sys.argv[1:] == ['server']:

The server is up with the ip 127.0.0.1 
Server is up and listening at ('127.0.0.1', 1060) 
+0

Это работает для меня. Я использую командную строку с «python file.py server» и работает правильно. Единственная проблема, с которой я столкнулся, - это журнал. Не печать сервера. – user1817988

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