Python + Sockets

Iniciado por anarquistadel89, 3 Diciembre 2009, 02:27 AM

0 Miembros y 1 Visitante están viendo este tema.

anarquistadel89

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:

Código (python) [Seleccionar]

#!/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?

anarquistadel89@googlewave.com

pucheto

No entiendo bien esta parte...
Código (python) [Seleccionar]

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?

anarquistadel89

a los clientes, si no como reenvio los mensajes?

Soy un pelin novato en Python, apenas llevo dos semanas programando en serio  :-\

anarquistadel89@googlewave.com

pucheto

Acabo de hacer esto como para un ejemplo...
Es un server sincronico q acepta de a 1 conexion

Código (python) [Seleccionar]
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:
Código (python) [Seleccionar]
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...

anarquistadel89

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?

anarquistadel89@googlewave.com

pucheto

Código (python) [Seleccionar]
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