У меня проблема с одним из моих университетских проектов. Мы делаем сокеты и 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)
Код сервера клиентов, журнал не работает при вызове с сервера во время его работы.
Вы используете как клиент, так и сервер на той же машине, используя тот же порт? – thebjorn
Да. Программа работает нормально, только журнал не работает. – user1817988
Распечатайте serverIp и PORT перед тем, как вы выполните ss.sendto (имя пользователя, (serverIp, PORT)) '... – thebjorn