Revisando en uno de mis backups encontré este chat que codee hace algún tiempo para una LAN con un servidor que acepta multiples conexiones. Hay mucho que mejorar pero espero le sirva a alguien.
Servidor:
from threading import Thread as Process
import socket
import cPickle as pickle
class servidor():
def __init__(self):
self.port = 9001
self.host = socket.gethostname()
self.conectados = []
self.escuchar()
def escuchar(self):
try:
ser = socket.socket()
ser.bind((self.host, self.port))
ser.listen(5)
while True:
(sck, addr) = ser.accept()
if not sck in self.conectados:
self.conectados.append(sck)
Process(target=self.indpt, args=(sck,addr)).start()
except KeyboardInterrupt:
print c.FAIL % ("Saliendo")
ser.close()
return
def indpt(self, sck, addr):
try:
direccion = "%s:%i" % addr
print c.OKGREEN % ("conectado a: " + direccion)
sck.send(pickle.dumps(("Servidor", "Conectado al servidor")))
while True:
buff = sck.recv(10024).strip()
if not len(buff):
print c.FAIL % (direccion + " desconectado")
self.conectados.remove(sck)
sck.close()
return
else:
for i in self.conectados:
if i != sck:
print i.send(buff + "\r\n")
except:
print c.FAIL % (direccion + " desconectado")
sck.close()
return
class c:
OKGREEN = '\033[92m[*] %s\033[0m'
FAIL = '\033[91m[-] %s\033[0m'
servidor()
Cliente:
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import cPickle as pickle
import socket
import time
import sys
class Gui(QWidget):
def __init__(self, host, port):
QWidget.__init__(self)
self.nick = "Yo"
self.recv = QTextEdit()
self.send = QLineEdit()
self.btn_send = QPushButton("Enviar")
self.btn_connect = QPushButton("Conectar")
hbox = QHBoxLayout()
vbox = QVBoxLayout()
vbox.addWidget(self.recv)
vbox.addLayout(hbox)
vbox.addWidget(self.btn_connect)
hbox.addWidget(self.send)
hbox.addWidget(self.btn_send)
self.setLayout(vbox)
self.btn_send.clicked.connect(self.enviar)
self.btn_connect.clicked.connect(self.conectar)
def conectar(self):
self.con = Conectar()
self.connect(self.con, SIGNAL("conexion"), self.conexion)
self.con.show()
def conexion(self, data, nick):
self.nick = nick
self.sck = socket.socket()
self.sck.connect(data)
self.e_thread = Escuchar(self.sck)
self.connect(self.e_thread, SIGNAL("message"), self.mensaje)
self.e_thread.start()
def mensaje(self, data):
mensaje = '<font color="red">%s: </font>%s' % data
self.recv.append(mensaje)
def enviar(self):
data = str(self.send.text().toAscii())
paquete = (self.nick, data)
paquete = pickle.dumps(paquete)
if data:
self.sck.send(paquete)
self.send.setText("")
self.mensaje((self.nick, data))
class Conectar(QWidget):
def __init__(self):
QWidget.__init__(self)
self.host = QLineEdit(socket.gethostname())
self.port = QLineEdit()
self.nick = QLineEdit()
self.btn_connect = QPushButton("Conectar")
hport = QHBoxLayout()
hhost = QHBoxLayout()
hnick = QHBoxLayout()
vbox = QVBoxLayout()
hhost.addWidget(QLabel("Host:"))
hhost.addWidget(self.host)
hport.addWidget(QLabel("Port:"))
hport.addWidget(self.port)
hnick.addWidget(QLabel("Nick:"))
hnick.addWidget(self.nick)
vbox.addLayout(hhost)
vbox.addLayout(hport)
vbox.addLayout(hnick)
vbox.addWidget(self.btn_connect)
self.setLayout(vbox)
self.btn_connect.clicked.connect(self.comprobar)
def comprobar(self):
port = int(self.port.text().toAscii())
host = str(self.host.text().toAscii())
nick = str(self.nick.text().toAscii())
if not nick:
nick = host
if port and host:
self.emit(SIGNAL("conexion"), (host, port), nick)
class Escuchar(QThread):
def __init__(self, sck):
QThread.__init__(self)
self.sock = sck
def run(self):
while True:
buff = self.sock.recv(10024).strip()
serialized = pickle.loads(buff)
time.sleep(0.3)
self.emit(SIGNAL("message"), serialized)
def __del__(self):
self.wait()
App = QApplication(sys.argv)
GUI = Gui("192.168.1.7", 9001)
GUI.show()
App.exec_()
Saludos!
muy interesante
es raro encontrarse con códigos viejos, uno siempre les encuentra detalles que representan lo que uno aprendió desde ese momento hasta ahora jajaja.
saludos!
No tienes permitido ver los links.
Registrarse o Entrar a mi cuenta
muy interesante
es raro encontrarse con códigos viejos, uno siempre les encuentra detalles que representan lo que uno aprendió desde ese momento hasta ahora jajaja.
saludos!
Es verdad brother, por eso me gusta revisar de vez en cuando mis backups.
PD: Que bueno verte de nuevo bro.
Saludos!