Estoy haciendo un chat en Python y el servidor me esta dando muchos problemas... La idea es que dos clientes se conectan al servidor, y este reenvia todo lo que recibe a los dos clientes.
El problema viene porque mi server esta asi:
#!/usr/bin/env python
import socket
s = socket.socket()
s.bind(('192.168.1.35',9999))
s.listen(1)
sc, addr = s.accept()
c = socket.socket()
a = socket.socket()
c.connect(('192.168.1.34', 9998))
a.connect(('192.168.1.35',9997))
while True:
resp = sc.recv(1024)
print resp
c.send(resp)
a.send(resp)
Si uno de los clientes intenta conectarse, el servidor tira error porque no puede conectarse con el otro. (Obvio que hago algo mal ya que asi solo funcionara cuando los dos clientes conecten a la vez con el server...)
Que tengo mal en el diseño?
No entiendo bien esta parte...
sc, addr = s.accept()
c = socket.socket()
a = socket.socket()
c.connect(('192.168.1.34', 9998))
a.connect(('192.168.1.35',9997))
while True:
resp = sc.recv(1024)
print resp
c.send(resp)
a.send(resp)
A quien se conectan c y a?
a los clientes, si no como reenvio los mensajes?
Soy un pelin novato en Python, apenas llevo dos semanas programando en serio :-\
Acabo de hacer esto como para un ejemplo...
Es un server sincronico q acepta de a 1 conexion
import socket
s = socket.socket()#iniciamos el socket q va a escuchar
s.bind(('127.0.0.1',9999))
s.listen(2)#empezamos a escuchar
totalData = "Welcom to the super server!\n"
while True:
sc, addr = s.accept() #accept() devuelve una tupla sc (q es el socket del cliente) addr q es una tupla ("IP", puerto)
ip,p = addr
print "From : " + ip
data = "" + sc.recv(1024) + "\n" #leemos lo q nos manda el cliente
totalData += data
sc.send(totalData) #y le respondemos
sc.close()#cerramos la conexion... y el ciclo vuelve a empezar...
Este server sirve para atender de a 1 conexion a la vez... Para tratar con varias podes ir usando Select, Threads.. etc..
Cliente:
import socket
TotalData = ""
while True:
s = socket.socket() #inicializamos el socket
data = raw_input("<<")
s.connect(("127.0.0.1",9999)) #lo conectamos al mismo puerto donde el server escucha
s.send(data) #mandamos cosas
TotalData = "" + s.recv(1024*4) #recivimos cosas
print TotalData #mostramos la cosa
s.close() #cerramos la cosa de la cosa (?) cerramos el socket
del s
Repito... no busca ni prolijidad ni nada esto... es para q veas masomenos un ejemplo... si buscas bien debe haber en este foro... y en internet varios ejemplos de todo tipo...
Hasta ahi he llegado, el problema es precisamente las multiconexiones. En princpio me conformo con entender como hacerlo con dos clientes...
Lo unico que busco es un esquema para entender como codificar el servidor "/
Usando threads y select como?
import socket, select
s = socket.socket()#iniciamos el socket q va a escuchar
s.bind(('127.0.0.1',9999))
s.listen(5)#empezamos a escuchar
input = [s] #en s vamos a poner la lista de sockets a atender
totalData = "Welcom to the super server!\n"
while True:
rs ,ws ,es = select.select(input,[],[]) #rs read stream, write stream, error stream (creo no me acuerdo bien)
for r in rs:
if r is s: #si el socket es el q hace el listen, espero una conexion nueva
c, addr = s.accept()
ip , port = addr
print "From : " + ip
input.append(c)
else: #sino lo atiendo
try:
data = r.recv(1024)
disconnected = not data
if not disconnected:
totalData += "" + data + "\n"
except disconnected:
disconnected = True
print r.gerpeername(), " disconnected"
input.remove(r) #si se desconecto lo saco de la cola...
Algo asi?
No lo probe...
Sino tenes clases para servers dadas por la libreria standard de python...
De ultima busca el libro fundations of python network programing