-
Notifications
You must be signed in to change notification settings - Fork 1
/
servidor.py
129 lines (107 loc) · 3.93 KB
/
servidor.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import socket
import threading
import _thread
import logging
import hashlib
import datetime
import time
import os
ready = False
archivo = None
lock = threading.Lock()
oks = []
def threaded(socketC, idCli):
global oks
global ready
global lock
m = hashlib.sha256()
logging.info('Cliente #%i iniciado', idCli)
ok = int(socketC.recv(1024).decode('utf8'))
logging.info('El cliente #%i está listo para recibir', idCli)
lock.acquire()
oks[idCli] = 1
esperar = False
for i in oks:
if i == 0:
esperar = True
break
ready = not esperar
lock.release()
while esperar:
esperar = not ready
with open(archivo, 'rb') as enviar:
data = enviar.read()
m.update(data)
tiempoIni = time.time()
numBytes = socketC.send(data)
logging.info(
'Archivo enviado al cliente #%i, bytes enviados: %i', idCli, numBytes)
print('Archivo enviado al cliente ' + str(idCli))
hashM = m.hexdigest()
numBytes += socketC.send(('Hash:' + hashM).encode())
tiempoFin = time.time()
logging.info(
'Hash enviado al cliente #%i, bytes enviados en total: %i', idCli, numBytes)
print('Hash enviado al cliente ' + str(idCli))
logging.info('Tiempo del envío al cliente #%i: %i',
idCli, (tiempoFin-tiempoIni))
socketC.close()
def main():
global archivo
global oks
print('Bienvenido')
fecha = datetime.datetime.today().strftime('%Y-%m-%d_%H-%M-%S')
nombreLog: str = './archivosS/log_' + fecha + '.log'
logging.basicConfig(filename=nombreLog, level=logging.INFO, datefmt='%Y-%m-%d %H:%M:%S',
format='%(asctime)s %(levelname)-8s %(message)s')
host = '0.0.0.0'
puerto = 55555
logging.info('Conectado a %s en el puerto %s', host, puerto)
socketS = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socketS.bind((host, puerto))
print('Puerto: ', puerto)
socketS.listen(5)
print('Escuchando...')
elegirArchivo = int(
input('¿Qué archivo desea enviar? 1. 100 MB \t 2. 250 MB \t 3. Zimzalabim.mp4 \n'))
if elegirArchivo == 1:
archivo = './data/100MB.zip'
logging.info('Archivo a enviar: 100MB.zip con tamaño de 100 MB')
elif elegirArchivo == 2:
archivo = './data/250MB.zip'
logging.info('Archivo a enviar: 250MB.zip con tamaño de 250 MB')
else:
archivo = './data/Zimzalabim.mp4'
logging.info('Archivo a enviar: Zimzalabim.mp4')
print('Se ha seleccionado el archivo ', archivo)
filesize = os.path.getsize(archivo)
numClientes = int(input(
'¿A cuántos clientes desea enviar el archivo? Ingrese el número únicamente\n'))
logging.info('Número de clientes: %i', numClientes)
print('Se enviará el archivo a ' + str(numClientes) + ' clientes')
for i in range(numClientes):
oks.append(0)
threads = []
recibir = True
while recibir:
(socketC, direccion) = socketS.accept()
if(archivo == './data/Zimzalabim.mp4'):
socketC.send((str(len(threads)) + '–Prueba-' +
str(numClientes) + '.mp4|' + str(filesize)).encode('utf8'))
else:
socketC.send((str(len(threads)) + '–Prueba-' +
str(numClientes) + '.zip|' + str(filesize)).encode('utf8'))
print('Se ha conectado el cliente ' + str(len(threads)) +
'(' + str(direccion[0]) + ':' + str(direccion[1]) + ')')
logging.info('Conexión con éxitosa con %s:%s. Asignado id: %i',
direccion[0], direccion[1], len(threads))
threadAct = threading.Thread(
target=threaded, args=(socketC, len(threads)))
threads.append(threadAct)
if len(threads) == numClientes:
recibir = False
for i in threads:
i.start()
threads = []
socketS.close()
main()