cliente.py

from socket import *
import sys
import time
from threading import Thread

PORT = 2343

#subclasse da classe Thread. essa classe conecta com o servidor e envia os dados para serem calculados
class cliente(Thread):
	def __init__ (self,ip,trials): #construtor da classe
		Thread.__init__(self) #chama o construtor da classe pai
		self.ip = ip #o ip que deve conectar
		self.hits = -1 #armazena o resultado 
		self.trials = str(trials) #numero de tentativas 
	def run(self): #essa eh a parte que serah executada
		print "trhread do ip "+str(self.ip)+" iniciou"
		#abre a conexao com o servidor
		s = socket(AF_INET,SOCK_STREAM)
		s.connect((self.ip,PORT))
		#envia para o servidor o numero de tentativas
		s.send(self.trials)
		#fica esperando o resultado do calculo do servidor
		self.hits = s.recv(1024)
		s.close()
		print "trhread do ip "+str(self.ip)+" finalizou com o resultado="+str(self.hits)

#funcao que verifica se os servidores estao ativos
def ativos(servidores):
	ativos = []#lista com os servidores ativos
	for ip in servidores:
		try:
			print "testando "+str(ip)
			s = socket(AF_INET,SOCK_STREAM)
			s.connect((ip,PORT))
			s.send("PING")#manda um comando ping para ver se o servidor ainda esta ativo
			s.close()
			ativos.append(ip)
		except:
			#print "Unexpected error:", sys.exc_info()[0]
			pass
	return ativos
	
trials = sys.argv[1] #recebe do parametro do usuario o numero maximo de tentativas
print "Verificando servidores ativos"
#verifica o numero de servidores ativos
servidores = ativos(['192.168.200.14', '200.135.240.1', '192.168.200.11', '192.168.200.5'])
if len(servidores) == 0:
	print "Nao existem servidores ativos"
	sys.exit()
print "Servidores ativos:"+str(servidores)
#calcula o numero de tentativas que cada servidor deve executar
trials_por_servidor = int(trials) / len(servidores)
resultado = [] #lista com as threads em execucao
t0=time.time() #usado para o calculo do tempo de execucao

for ip in servidores:
	atual = cliente(ip, trials_por_servidor) #cria uma nova thread
	resultado.append(atual) #adiciona a thread na lista de threads 
	atual.start() #inicia a thread
	
total_hits = 0 #total dos resultados
for r in resultado:
	r.join()#espera ate a thread terminar
	total_hits += int(r.hits)

#faz o calculo do pi usando os resultados enviados por cada servidor
pi = 4.0 * int(total_hits) / int(trials)

print "Pi :" + str(pi)
tf=time.time()
print 'O tempo gasto na execucao eh: ',tf-t0,'[s]'

Generated by GNU enscript 1.6.4.