Python - error en sockets

   
Vista:

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
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Indentación

Publicado por e.t (1 intervención) el 29/01/2011 00:20:59
# Esta web necesita una opcion para adjuntar archivos o por lo menos que el codigo escrito o pegado se vea correctamente...

------------------------------------------------------------------------------------------------------------------------------------------------------

# esto espera a recivir un valor(respuesta), en otro caso se queda ahi...
result=sock.recv()

# la solucion seria volver a iniciar desde cero el proyecto hasta lograr una conexion cliente-servidor exitosa y que puedan interactuar, luego extenderla...

hasta parezco inteligente haciendo estos comentarios... :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Indentación

Publicado por pao (2 intervenciones) el 29/01/2011 13:15:25
te apoyo en lo de q los codigos pegados no se bien y resulta medio molesto..
si,exactamente es ese el problema... cuando esa linea esta activa comprobe q el servidor nunca termina de recibir los datos... cuando esta comentada el servidor recibe todos los datos perfectamente porq lo escribe en el archivo.. en verdad q me esta por matar .. estoy rehaciendo y organizando mi codigo pa ver si consigo algo.. muchisimas gracias por la ayuda
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar