[PyQt4] Chat multiconexión

Iniciado por Once, Noviembre 08, 2013, 09:39:23 PM

Tema anterior - Siguiente tema

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

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:

Código: python
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:

Código: python
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!







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!

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!







No tienes permitido ver los links. Registrarse o Entrar a mi cuenta