error en sockets
Publicado por pao (2 intervenciones) el 28/01/2011 00:39:47
buenas a todos.. soy nueva en el foro.. tengo problemas serios con un programita que estoy realizando.. el tema es q tengo q registrar y conectar usuarios... al registrar un usuario mi cliente envia los datos al servidor y este los debe verificar en su lista de usuarios(guardados en un diccionario) si ya existe un usuario debe enviar el error al cliente y si no debe enviar el ok de la operacion.. al ejecutar mi codigo se quedan colgados tanto mi cliente como mi servidor.. lo simpatico es q al comentar una linea en mi cliente todo magicamente resulta bien mi programa pero el tema es q yo necesito q el servidor le envie el error o la confirmacion de registro al cliente prfa si me pueden ayudar.. aca les dejo mi codigo
miren la linea result=sock.recv() es la q si comento todo funciona
servidor
import sys, os, thread, time
from socket import *
from usuario import *
try:
import cPickle as pickle
except ImportError:
import pickle
blksz = 4096
usuarios = {}
def recibir_objeto(csock):
file = open("temp_user", 'wb') # create local file in cwd
while True:
data = csock.recv(blksz) # get up to 1K at a time
if not data: break # till closed on server side
file.write(data)
file.close()
file2 = open("temp_user", 'rb')
user = pickle.load(file2)
print user.getNombre(), "\t", user.getPassword()
file2.close()
return user
def registrar_user(user):
global usuarios
name=user.getNombre()
password=user.getPassword()
ip= user.getIp()
puerto=user.getPuerto()
string= name + "\t" + password + "\t" + ip + "\t" + str(puerto) + "\t"+ "desconectado" + "\n"
boolean=usuarios.has_key(name)
print string
if not boolean:
usuarios = {name:user}
file=open("usuarios.txt", 'a')
file.write(string)
file.close()
return 0
else:
return 1
def serverthread(csock,ip):
global usuarios
opcion = csock.recv(1024)
csock.send("OK")
if opcion == "registrar":
user=recibir_objeto(csock)
print "Ya recibio el obj"
user.setIp(ip)
print "Seteo el TP"
user.setEstado("conectado")
print "Cambio de estado"
print user.getPuerto()
result = registrar_user(user)
if result == 0:
try:
csock.send("OK")
except socket.error, e:
print "Error enviando datos: %s" %e
# opcion = csock.recv(1024)
else:
print "enviar error"
try:
csock.send("ERROR")
except socket.error, e:
print "Error enviando datos: %s" %e
elif opcion == "conectar":
user=recibir_objeto(csock)
name=user.getNombre()
contra=user.getPassword()
boolean=usuarios.has_key(name)
if boolean :
user2=usuarios[name]
if user2.getPassword() == contra:
user2.setEstado("conectado")
usuarios[name]=user2
print "aca"
print usuarios[name]
user3=usuarios[name]
print "estado"
print user3.getEstado()
# csock.send("ok")
else:
print "contrasenia invalida"
else:
print "usuario invalido"
# csock.send("error")
csock.close( )
def server(host, port):
try:
serversock = socket(AF_INET, SOCK_STREAM)
except socket.error, e:
print "Error creando el socket: %s" %e
serversock.bind((host, port)) # serve clients in threads
serversock.listen(5)
while True:
try:
csock, (ip,puerto) = serversock.accept( )
except KeyboadInterrupt:
raise
except:
traceback.print_exc()
thread.start_new_thread(serverthread, (csock,ip))
def main():
cargar_user()
server("localhost",50001)
def cargar_user():
global usuarios
try:
file = open("usuarios.txt",'r')
while True:
linea = file.readline()
if linea:
lista=linea.split("\t")
nombre= lista[0]
password=lista[1]
ip=lista[2]
puerto=int(lista[3])
lista2=lista[4].split("\n")
estado=lista2[0]
user=usuario()
user.setNombre(nombre)
user.setPassword(password)
user.setIp(ip)
user.setPuerto(puerto)
user.setEstado(estado)
usuarios={nombre:user}
elif not linea: break
except IOError, e:
file = open("usuarios.txt",'w')
file.close()
if __name__ == '__main__':
main()
cliente
import sys, os, thread, time, random
from socket import *
from usuario import usuario
try:
import cPickle as pickle
except ImportError:
import pickle
def now(): return time.ctime(time.time( ))
blksz = 4096
serverIp = "localhost"
serverPort = 50001
clientPortListen=0
def cliente(host, port, file, user,opcion):
global blksz
try:
sock = socket(AF_INET, SOCK_STREAM)
except socket.error, e:
print "Error creando el socket: %s" %e
try:
sock.connect((host, port))
except socket.gaierror, e:
print "Error conectando al servidor %s" %e
try:
sock.send(opcion)
except socket.error, e:
print "Error enviando datos: %s" %e
data=sock.recv(blksz)
print data
if opcion == "registrar":
print data
enviar_objeto(sock,data,user)
#arreglar confirmacion de registro
# result = sock.recv(blksz) # get up to 1K at a time
# print result
# if result == "error":
# print "El usuario ya existe"
# else: print "exito"
elif opcion == "conectar":
sock.send(opcion)
data=sock.recv(blksz)
enviar_objeto(sock,data,user)
if data == "ok":
print "conectado"
elif data=="error":
print "el usuario no existe"
elif opcion == "transferir":
#desplegar lista()
recibir_archivo(sock,file)
result = sock.recv(blksz) # get up to 1K at a time
print result
if result == "error":
print "El usuario ya existe"
else: print "exito"
sock.close()
def serverthread(csock):
global blksz
enviar_archivo(csock)
csock.close()
def server(host, port):
serversock = socket(AF_INET, SOCK_STREAM) # listen on TCP/IP socket
serversock.bind((host, port)) # serve clients in threads
serversock.listen(5)
while True:
csock, clientaddr = serversock.accept( )
thread.start_new_thread(serverthread, (csock,))
def main():
global clientPortListen
global serverIp
global serverPort
user=usuario()
asignar_puerto()
#server(host, puerto)
print "Menu Principal\n\n\n\n"
print "\t1- trasnferir archivo\n"
print "\t2- Registrarse en la red\n"
opcion=raw_input("\n\nIngrese opcion:")
if opcion == "1":
#conectarse a la red
nombre=raw_input("Usuario:")
contra=raw_input("contrasenia:")
user.setNombre(nombre)
user.setPassword(contra)
cliente(serverIp,serverPort,"",user,"conectar")
elif opcion == "2":
#registar un usuario nuevo
user.setNombre(raw_input ("Ingrese el nombre de usuario: "))
user.setPassword(raw_input ("Ingrese el contrasenia de usuario: "))
print clientPortListen
user.setPuerto(clientPortListen)
cliente(serverIp,serverPort,"",user,"registrar")
elif opcion == "3":
#transferir archivo
name = raw_input()
#el host y el puerto dependera del archivo y le user q despliegue el server central
cliente(host,puerto,name,0,"transferir")
else:
print "opcion incorrecta"
def enviar_objeto(sock,data,obj):
global blksz
if data == "OK":
file = open("temp_user", 'wb')
pickle.dump(obj,file,2)
file.close()
file2 = open("temp_user", 'rb')
try:
while True:
bytes = file2.read(blksz)
if not bytes: break
sent = sock.send(bytes)
assert sent == len(bytes)
except:
print "Expcion"
file2.close()
print "Termino de enviar\n"
def enviar_archivo(clientsock):
global blksz
sockfile = clientsock.makefile('r') # wrap socket in dup file obj
filename = sockfile.readline( )[:-1] # get filename up to end-line
try:
file = open(filename, 'rb')
while True:
bytes = file.read(blksz) # read/send 1K at a time
if not bytes: break # until file totally sent
sent = clientsock.send(bytes)
assert sent == len(bytes)
except:
print 'Error downloading file on server:', filename
def recibir_archivo(sock, filename):
global blksz
sock.send(filename + '\n') # send remote name with dir
dropdir = os.path.split(filename)[1] # filename at end of dir path
file = open(dropdir, 'wb') # create local file in cwd
while True:
data = sock.recv(blksz) # get up to 1K at a time
if not data: break # till closed on server side
file.write(data) # store data in local file
file.close( )
def asignar_puerto():
global clientPortListen
clientPortListen = random.randint(1025,65536)
print clientPortListen
if __name__ == '__main__':
main()
por favor ayudenme tengo poco tiempo para solucionar ese problema y ese es tan solo el comienzo de una gran aplicacion.. les agradeceria la ayuda, las criticas y recomendaciones ya q soy nueva usando python
miren la linea result=sock.recv() es la q si comento todo funciona
servidor
import sys, os, thread, time
from socket import *
from usuario import *
try:
import cPickle as pickle
except ImportError:
import pickle
blksz = 4096
usuarios = {}
def recibir_objeto(csock):
file = open("temp_user", 'wb') # create local file in cwd
while True:
data = csock.recv(blksz) # get up to 1K at a time
if not data: break # till closed on server side
file.write(data)
file.close()
file2 = open("temp_user", 'rb')
user = pickle.load(file2)
print user.getNombre(), "\t", user.getPassword()
file2.close()
return user
def registrar_user(user):
global usuarios
name=user.getNombre()
password=user.getPassword()
ip= user.getIp()
puerto=user.getPuerto()
string= name + "\t" + password + "\t" + ip + "\t" + str(puerto) + "\t"+ "desconectado" + "\n"
boolean=usuarios.has_key(name)
print string
if not boolean:
usuarios = {name:user}
file=open("usuarios.txt", 'a')
file.write(string)
file.close()
return 0
else:
return 1
def serverthread(csock,ip):
global usuarios
opcion = csock.recv(1024)
csock.send("OK")
if opcion == "registrar":
user=recibir_objeto(csock)
print "Ya recibio el obj"
user.setIp(ip)
print "Seteo el TP"
user.setEstado("conectado")
print "Cambio de estado"
print user.getPuerto()
result = registrar_user(user)
if result == 0:
try:
csock.send("OK")
except socket.error, e:
print "Error enviando datos: %s" %e
# opcion = csock.recv(1024)
else:
print "enviar error"
try:
csock.send("ERROR")
except socket.error, e:
print "Error enviando datos: %s" %e
elif opcion == "conectar":
user=recibir_objeto(csock)
name=user.getNombre()
contra=user.getPassword()
boolean=usuarios.has_key(name)
if boolean :
user2=usuarios[name]
if user2.getPassword() == contra:
user2.setEstado("conectado")
usuarios[name]=user2
print "aca"
print usuarios[name]
user3=usuarios[name]
print "estado"
print user3.getEstado()
# csock.send("ok")
else:
print "contrasenia invalida"
else:
print "usuario invalido"
# csock.send("error")
csock.close( )
def server(host, port):
try:
serversock = socket(AF_INET, SOCK_STREAM)
except socket.error, e:
print "Error creando el socket: %s" %e
serversock.bind((host, port)) # serve clients in threads
serversock.listen(5)
while True:
try:
csock, (ip,puerto) = serversock.accept( )
except KeyboadInterrupt:
raise
except:
traceback.print_exc()
thread.start_new_thread(serverthread, (csock,ip))
def main():
cargar_user()
server("localhost",50001)
def cargar_user():
global usuarios
try:
file = open("usuarios.txt",'r')
while True:
linea = file.readline()
if linea:
lista=linea.split("\t")
nombre= lista[0]
password=lista[1]
ip=lista[2]
puerto=int(lista[3])
lista2=lista[4].split("\n")
estado=lista2[0]
user=usuario()
user.setNombre(nombre)
user.setPassword(password)
user.setIp(ip)
user.setPuerto(puerto)
user.setEstado(estado)
usuarios={nombre:user}
elif not linea: break
except IOError, e:
file = open("usuarios.txt",'w')
file.close()
if __name__ == '__main__':
main()
cliente
import sys, os, thread, time, random
from socket import *
from usuario import usuario
try:
import cPickle as pickle
except ImportError:
import pickle
def now(): return time.ctime(time.time( ))
blksz = 4096
serverIp = "localhost"
serverPort = 50001
clientPortListen=0
def cliente(host, port, file, user,opcion):
global blksz
try:
sock = socket(AF_INET, SOCK_STREAM)
except socket.error, e:
print "Error creando el socket: %s" %e
try:
sock.connect((host, port))
except socket.gaierror, e:
print "Error conectando al servidor %s" %e
try:
sock.send(opcion)
except socket.error, e:
print "Error enviando datos: %s" %e
data=sock.recv(blksz)
print data
if opcion == "registrar":
print data
enviar_objeto(sock,data,user)
#arreglar confirmacion de registro
# result = sock.recv(blksz) # get up to 1K at a time
# print result
# if result == "error":
# print "El usuario ya existe"
# else: print "exito"
elif opcion == "conectar":
sock.send(opcion)
data=sock.recv(blksz)
enviar_objeto(sock,data,user)
if data == "ok":
print "conectado"
elif data=="error":
print "el usuario no existe"
elif opcion == "transferir":
#desplegar lista()
recibir_archivo(sock,file)
result = sock.recv(blksz) # get up to 1K at a time
print result
if result == "error":
print "El usuario ya existe"
else: print "exito"
sock.close()
def serverthread(csock):
global blksz
enviar_archivo(csock)
csock.close()
def server(host, port):
serversock = socket(AF_INET, SOCK_STREAM) # listen on TCP/IP socket
serversock.bind((host, port)) # serve clients in threads
serversock.listen(5)
while True:
csock, clientaddr = serversock.accept( )
thread.start_new_thread(serverthread, (csock,))
def main():
global clientPortListen
global serverIp
global serverPort
user=usuario()
asignar_puerto()
#server(host, puerto)
print "Menu Principal\n\n\n\n"
print "\t1- trasnferir archivo\n"
print "\t2- Registrarse en la red\n"
opcion=raw_input("\n\nIngrese opcion:")
if opcion == "1":
#conectarse a la red
nombre=raw_input("Usuario:")
contra=raw_input("contrasenia:")
user.setNombre(nombre)
user.setPassword(contra)
cliente(serverIp,serverPort,"",user,"conectar")
elif opcion == "2":
#registar un usuario nuevo
user.setNombre(raw_input ("Ingrese el nombre de usuario: "))
user.setPassword(raw_input ("Ingrese el contrasenia de usuario: "))
print clientPortListen
user.setPuerto(clientPortListen)
cliente(serverIp,serverPort,"",user,"registrar")
elif opcion == "3":
#transferir archivo
name = raw_input()
#el host y el puerto dependera del archivo y le user q despliegue el server central
cliente(host,puerto,name,0,"transferir")
else:
print "opcion incorrecta"
def enviar_objeto(sock,data,obj):
global blksz
if data == "OK":
file = open("temp_user", 'wb')
pickle.dump(obj,file,2)
file.close()
file2 = open("temp_user", 'rb')
try:
while True:
bytes = file2.read(blksz)
if not bytes: break
sent = sock.send(bytes)
assert sent == len(bytes)
except:
print "Expcion"
file2.close()
print "Termino de enviar\n"
def enviar_archivo(clientsock):
global blksz
sockfile = clientsock.makefile('r') # wrap socket in dup file obj
filename = sockfile.readline( )[:-1] # get filename up to end-line
try:
file = open(filename, 'rb')
while True:
bytes = file.read(blksz) # read/send 1K at a time
if not bytes: break # until file totally sent
sent = clientsock.send(bytes)
assert sent == len(bytes)
except:
print 'Error downloading file on server:', filename
def recibir_archivo(sock, filename):
global blksz
sock.send(filename + '\n') # send remote name with dir
dropdir = os.path.split(filename)[1] # filename at end of dir path
file = open(dropdir, 'wb') # create local file in cwd
while True:
data = sock.recv(blksz) # get up to 1K at a time
if not data: break # till closed on server side
file.write(data) # store data in local file
file.close( )
def asignar_puerto():
global clientPortListen
clientPortListen = random.randint(1025,65536)
print clientPortListen
if __name__ == '__main__':
main()
por favor ayudenme tengo poco tiempo para solucionar ese problema y ese es tan solo el comienzo de una gran aplicacion.. les agradeceria la ayuda, las criticas y recomendaciones ya q soy nueva usando python
Valora esta pregunta


0