¿Donde está el error?
Publicado por carcaharas (4 intervenciones) el 09/04/2007 19:07:31
Hola estoy intentando programar un chat en python (aunque me está costando dios y ayuda...) bueno despues de mucho buscar y buscar he conseguido encontrar algo de código e irlo juntando para que funcione, pero me hace una cosa muy rara, cuando desde un cliente veo lo que escribe otro me muestra letra a letra. Me explico: Si un cliente escribe "hola" a mi en el otro cliente se me ve algo así: [127.0.0.1 :1234] H 127.0.0.1 :1234]O 127.0.0.1 :1234]L 127.0.0.1 :1234] A
Por otro lado yo he codificado un cliente y un servidor pero para poder ver el chat en funiconamineto solo lo he conseguido empleadndo únicamente el servidor y haciendo que el cliente sea un telnet ¿Como puedo hacerlo para utilizar tambien el cliente y ejecutarlo normal desde el eclipse?, no se si me entendeis pero bueno esto es secundario. Os pego el código:
<<<EL SERVIDOR>>>
import socket
import select
def accept_new_connection():
try:
global server
global desc
newsock, (remhost, remport) = server.accept()
server.settimeout(.1)
print "Se ha conectado %s:%s" % (str(remhost), str(remport))
desc.append(newsock)
except:
pass
def broadcast(msg, sock):
global desc
global server
host, port = sock.getpeername()
msg = "[%s:%s]: %s" % (str(host), str(port), str(msg))
for destsock in desc:
if destsock != sock and destsock != server:
destsock.send(msg)
def get_msg(sock):
try:
msg = sock.recv(1024)
sock.settimeout(.1)
return msg
except:
global desc
host, port = sock.getpeername()
print "[%s:%s] ha salido." % (str(host), str(port))
desc.remove(sock)
return None
global server
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("", 8003))
server.listen(5)
global desc
desc = [server]
while 1:
accept_new_connection()
(sread, swrite, sexc) = select.select(desc, [], [])
for sock in sread:
if sock != server:
flag = get_msg(sock)
if flag:
broadcast(flag, sock)
<<<EL CLIENTE>>>>
mport sys
import socket
import select
import threading
class obj_tel(object):
def __init__(self):
self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print "Give me the Host or IP address: ",
self.tmp = str(sys.stdin.readline())
self.host = ''
for self.i in self.tmp:
if self.i != '\n':
self.host += self.i
self.flag = 0
self.port = ''
while self.flag == 0:
print "\nGive me the port number: ",
self.tmp = str(sys.stdin.readline())
try:
self.port = int(self.tmp)
self.flag = 1
except ValueError:
print "\nPort number can't contain strings.\n"
try:
self.client.connect((self.host, self.port))
print "\nConnection successfully made.\n"
except:
print "\nCan't connect.\n"
sys.stdin.readline()
self.exit_client()
self.telnet()
def telnet(self):
self.opt = [self.client]
self.msg = ''
while 1:
(self.rlist, self.wlist, self.xlist) = select.select(self.opt,
[], [], .9)
if self.rlist != []:
print "%s" % (str(self.client.recv(1024)), )
else:
self.slp = threading.Thread(target = self.get_data)
self.slp.start()
def get_data(self):
self.tmp = str(sys.stdin.readline())
self.msg = ''
for self.i in self.tmp:
if self.i != '\n':
self.msg += self.i
self.client.send(self.msg)
def exit_client(self):
raise SystemExit
if __name__ == "__main__":
telnet = obj_tel()
ESPERO QUE ME PODAIS AYUDAR. GRACIAS
Por otro lado yo he codificado un cliente y un servidor pero para poder ver el chat en funiconamineto solo lo he conseguido empleadndo únicamente el servidor y haciendo que el cliente sea un telnet ¿Como puedo hacerlo para utilizar tambien el cliente y ejecutarlo normal desde el eclipse?, no se si me entendeis pero bueno esto es secundario. Os pego el código:
<<<EL SERVIDOR>>>
import socket
import select
def accept_new_connection():
try:
global server
global desc
newsock, (remhost, remport) = server.accept()
server.settimeout(.1)
print "Se ha conectado %s:%s" % (str(remhost), str(remport))
desc.append(newsock)
except:
pass
def broadcast(msg, sock):
global desc
global server
host, port = sock.getpeername()
msg = "[%s:%s]: %s" % (str(host), str(port), str(msg))
for destsock in desc:
if destsock != sock and destsock != server:
destsock.send(msg)
def get_msg(sock):
try:
msg = sock.recv(1024)
sock.settimeout(.1)
return msg
except:
global desc
host, port = sock.getpeername()
print "[%s:%s] ha salido." % (str(host), str(port))
desc.remove(sock)
return None
global server
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("", 8003))
server.listen(5)
global desc
desc = [server]
while 1:
accept_new_connection()
(sread, swrite, sexc) = select.select(desc, [], [])
for sock in sread:
if sock != server:
flag = get_msg(sock)
if flag:
broadcast(flag, sock)
<<<EL CLIENTE>>>>
mport sys
import socket
import select
import threading
class obj_tel(object):
def __init__(self):
self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print "Give me the Host or IP address: ",
self.tmp = str(sys.stdin.readline())
self.host = ''
for self.i in self.tmp:
if self.i != '\n':
self.host += self.i
self.flag = 0
self.port = ''
while self.flag == 0:
print "\nGive me the port number: ",
self.tmp = str(sys.stdin.readline())
try:
self.port = int(self.tmp)
self.flag = 1
except ValueError:
print "\nPort number can't contain strings.\n"
try:
self.client.connect((self.host, self.port))
print "\nConnection successfully made.\n"
except:
print "\nCan't connect.\n"
sys.stdin.readline()
self.exit_client()
self.telnet()
def telnet(self):
self.opt = [self.client]
self.msg = ''
while 1:
(self.rlist, self.wlist, self.xlist) = select.select(self.opt,
[], [], .9)
if self.rlist != []:
print "%s" % (str(self.client.recv(1024)), )
else:
self.slp = threading.Thread(target = self.get_data)
self.slp.start()
def get_data(self):
self.tmp = str(sys.stdin.readline())
self.msg = ''
for self.i in self.tmp:
if self.i != '\n':
self.msg += self.i
self.client.send(self.msg)
def exit_client(self):
raise SystemExit
if __name__ == "__main__":
telnet = obj_tel()
ESPERO QUE ME PODAIS AYUDAR. GRACIAS
Valora esta pregunta


0