2014-02-19 33 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

在s.sendto(username,(serverIp,PORT))之前打印出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