Underc0de

Programación Scripting => Python => Mensaje iniciado por: Once en Noviembre 08, 2013, 09:39:23 PM

Título: [PyQt4] Chat multiconexión
Publicado por: Once en Noviembre 08, 2013, 09:39:23 PM
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) [Seleccionar]
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) [Seleccionar]
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!
Título: Re:[PyQt4] Chat multiconexión
Publicado por: Alex en Noviembre 08, 2013, 10:17:24 PM
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!
Título: Re:[PyQt4] Chat multiconexión
Publicado por: Once en Noviembre 18, 2013, 10:36:11 PM
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!