编译程序时,我收到了下一条消息:
Traceback (most recent call last):
File "cliente1.py", line 129, in <module>
sTCP.connect((iplista[y],int(portlista[y]))) #SE CONECTA N VECES
File "/usr/lib/python2.7/socket.py", line 228, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 111] Connection refused
关于这一点的奇怪之处在于,消息不是每次都显示,只是在大多数时间,因为有时它运作良好。 这里有一个示例,其中不显示消息:
我希望它正常工作,我真的不知道为什么连接被拒绝,如果有人能告诉我,我会感激
#importar librerias
import socket
import sys #para cerrar el sistema
import os #para saber tamanio del fichero
import md5 #para hacer huella de seguridad
import time
BUFFER_SIZE = 1024
if len(sys.argv) != 2: #el nombre del programa cuenta como argumento
print("Error. Uso: python %s ./fichero" % (sys.argv[0]))
sys.exit()
nombre_fichero = sys.argv[1] #nombre del fichero dado en los argumentos
#creacion de sockets
#leemos el archivo config.txt (OJO CON LA RUTA)
try:
configtxt = open('./config.txt') #puedes poner conffig para un fichero vacio
#data1 = configtxt.readline() puedes indicarle el numero de bytes que lea
except:
print("Error, no hay servidores o ficheros de configuracion", sys.exc_info()[0])
raise
#almacenamos las lineas del fichero en una tabla
# Splits the element by "\n"
lineas = configtxt.readlines()
#Print List of Lines in your File
#print(lines)
#Print Number of Lines in your File
#print(len(lines))
numero_de_lineas = len(lineas)
#Access Second Line in your file
#print(lineas[0])
#print(numero_de_lineas)
check = 1 #si vale 0 no hay lineas en config.txt
try:
linea1 = lineas[0]
except IndexError:
check = 0
if check == 0: #si esta vacia la primera linea de ./config.txt :ERROR
print("Error, no hay servidores o ficheros de configuracion")
sys.exit()
else:
#resto del programa
try: #existe el fichero que le he dado en los argumentos?
fichero = open(nombre_fichero)
except IOError as error1: #No existe
print("Error. Fichero %s inexistente:" % nombre_fichero)
print(error1)
sys.exit()
#resto del programa si todo lo anterior va bien
#le enviamos un mensaje al 1er server con el nombre del fichero y su tamanio
#para saber tamanio en bytes: os.stat("file").st_size
tamanio_fichero_int = os.stat(nombre_fichero).st_size
#convertimos ese tamanio_fichero_int a str porque sino no deja concatenar
tamanio_fichero_str = str(tamanio_fichero_int)
#concatenamos nombre_fichero y tamanio_fichero
mensaje1 = nombre_fichero + " " + tamanio_fichero_str #mensaje a enviar listo
iplista = list() #creamos las listas
portlista = list()
sUDP = list()
for x in range (0,numero_de_lineas):
ip , port = lineas[x].split()
iplista.append(ip) #anadirmos a la lista las ips
portlista.append(port) #anadimos a la lista los puertos
#tupla = (str(iplista[0]),int(portlista[0]))
#sUDP.sendto(mensaje1,tupla)
#print(tupla)
time_out = 3
time_out_TCP = 10
counter = 1
reintentar = 0 #si hay que reintentar una transmision , reintentar vale 1
y = 0 #interacciones
contenido_fichero = fichero.read() #lo que hay dentro de ./fichero.txt
while y != numero_de_lineas:
print "Interaccion numero", y
try: #tenemos que crear el socket tcp en cada interaccion porque sino ya esta en uso
sUDP = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #UDP
sTCP = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #TCP
except socket.error :
print "Error al crear socket TCP"
sys.exit()
if reintentar == 1:
print y
reintentar = 0
tupla = (str(iplista[y]),int(portlista[y]))
sUDP.sendto(mensaje1,tupla)
try:
sUDP.settimeout(time_out)
respuesta1 , address1 = sUDP.recvfrom(BUFFER_SIZE)
#si todo va bien tengo respuesta1
#print(respuesta1) #recibo ni ok ni no
if (respuesta1 == "ok"):
sTCP.connect((iplista[y],int(portlista[y]))) #SE CONECTA N VECES
sTCP.send(contenido_fichero)
try:
sTCP.settimeout(time_out_TCP) #esperamos 10 segundos
respuesta2 = sTCP.recv(BUFFER_SIZE)
#LIBERAMOS LA CONEXION TCP
#print(respuesta2) #recibo transferdone
#si recibe respuesta1 y respuesta2 paramos
#empezamos con el calculo de la huella con el server aceptado iplista[y],portlista[y]
huella_md5 = md5.new() #creamos la huella
huella_md5.update(contenido_fichero) #actualicamos su contenido (le podemos meter mas strings despues)
huella_md5_calculada = huella_md5.hexdigest() #huella en string
sUDP.sendto(huella_md5_calculada,tupla)
try:
sUDP.settimeout(time_out_TCP) #porque son 10 segundos
respuesta3 , address3 = sUDP.recvfrom(BUFFER_SIZE)
if respuesta3 == "md5sum ok":
print "Copia de fichero en servidor",iplista[y],"correcta"
if respuesta3 == "md5sum error":
print "Error en la copia del fichero en el servidor",iplista[y],"Se vuelve a intentar" #REINTENTAR
reintentar = 1
except socket.timeout:
print "Error en la copia del fichero en el servidor",iplista[y],". Finalizado el intento"
except socket.timeout:
print "Error en la transferencia con el servidor",str(iplista[y])
if respuesta1 == "no":
print "Error. El servidor",iplista[y],"no acepta el fichero"
except socket.timeout:
print "Error: no hay respuesta por parte del servidor", iplista[y] , "en el puerto", portlista[y]
#if y == (numero_de_lineas-1): #-1 porque para y el cero cuenta
#sys.exit() #si todos fallaron al conectar udp nos salimos
#fin del bucle
sUDP.close()
sTCP.close()
if (reintentar != 1):
y = y+1 #si no se reintenta la conexion pasamos al siguiente server
#no olvidar cerrar sockets y ficheros
fichero.close()
configtxt.close()