[PyQt4] Chat multiconexión

  • 2 Respuestas
  • 2517 Vistas

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

Desconectado Once

  • *
  • Underc0der
  • Mensajes: 391
  • Actividad:
    0%
  • Reputación 0
  • Twitter: @don_once
    • Ver Perfil
    • El blog de Once

[PyQt4] Chat multiconexión

  • 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
  1. from threading import Thread as Process
  2.  
  3. import socket
  4. import cPickle as pickle
  5.  
  6. class servidor():
  7.     def __init__(self):
  8.         self.port = 9001
  9.         self.host = socket.gethostname()
  10.         self.conectados = []
  11.         self.escuchar()
  12.    
  13.     def escuchar(self):
  14.         try:
  15.             ser = socket.socket()
  16.             ser.bind((self.host, self.port))
  17.             ser.listen(5)
  18.             while True:
  19.                 (sck, addr) = ser.accept()
  20.                 if not sck in self.conectados:
  21.                     self.conectados.append(sck)
  22.                     Process(target=self.indpt, args=(sck,addr)).start()
  23.         except KeyboardInterrupt:
  24.             print c.FAIL % ("Saliendo")
  25.             ser.close()
  26.             return
  27.    
  28.     def indpt(self, sck, addr):
  29.         try:
  30.             direccion = "%s:%i" % addr
  31.             print c.OKGREEN % ("conectado a: " + direccion)
  32.             sck.send(pickle.dumps(("Servidor", "Conectado al servidor")))
  33.             while True:
  34.                 buff = sck.recv(10024).strip()
  35.                 if not len(buff):
  36.                     print c.FAIL % (direccion + " desconectado")
  37.                     self.conectados.remove(sck)
  38.                     sck.close()
  39.                     return
  40.                 else:
  41.                     for i in self.conectados:
  42.                         if i != sck:
  43.                             print i.send(buff + "\r\n")
  44.         except:
  45.             print c.FAIL % (direccion + " desconectado")
  46.             sck.close()
  47.             return
  48.  
  49. class c:
  50.     OKGREEN = '\033[92m<ul class="bbc_list"><li type="disc"> %s\033[0m'[/li][/list]
  51.     FAIL = '\033[91m[-] %s\033[0m'
  52.  
  53. servidor()

Cliente:

Código: Python
  1. from PyQt4.QtCore import *
  2. from PyQt4.QtGui import *
  3.  
  4. import cPickle as pickle
  5. import socket
  6. import time
  7. import sys
  8.  
  9.  
  10. class Gui(QWidget):
  11.     def __init__(self, host, port):
  12.         QWidget.__init__(self)
  13.        
  14.         self.nick = "Yo"
  15.        
  16.         self.recv = QTextEdit()
  17.         self.send = QLineEdit()
  18.         self.btn_send = QPushButton("Enviar")
  19.         self.btn_connect = QPushButton("Conectar")
  20.        
  21.         hbox = QHBoxLayout()
  22.         vbox = QVBoxLayout()
  23.        
  24.         vbox.addWidget(self.recv)
  25.         vbox.addLayout(hbox)
  26.         vbox.addWidget(self.btn_connect)
  27.        
  28.         hbox.addWidget(self.send)
  29.         hbox.addWidget(self.btn_send)
  30.        
  31.         self.setLayout(vbox)
  32.  
  33.         self.btn_send.clicked.connect(self.enviar)
  34.         self.btn_connect.clicked.connect(self.conectar)
  35.    
  36.     def conectar(self):
  37.         self.con = Conectar()
  38.         self.connect(self.con, SIGNAL("conexion"), self.conexion)
  39.         self.con.show()
  40.    
  41.     def conexion(self, data, nick):
  42.         self.nick = nick
  43.         self.sck = socket.socket()
  44.         self.sck.connect(data)
  45.        
  46.         self.e_thread = Escuchar(self.sck)
  47.         self.connect(self.e_thread, SIGNAL("message"), self.mensaje)
  48.         self.e_thread.start()
  49.    
  50.     def mensaje(self, data):
  51.         mensaje = '<font color="red">%s: </font>%s' % data
  52.         self.recv.append(mensaje)
  53.    
  54.     def enviar(self):
  55.         data = str(self.send.text().toAscii())
  56.        
  57.         paquete = (self.nick, data)
  58.         paquete = pickle.dumps(paquete)
  59.        
  60.         if data:
  61.             self.sck.send(paquete)
  62.             self.send.setText("")
  63.             self.mensaje((self.nick, data))
  64.    
  65.  
  66. class Conectar(QWidget):
  67.     def __init__(self):
  68.         QWidget.__init__(self)
  69.        
  70.         self.host = QLineEdit(socket.gethostname())
  71.         self.port = QLineEdit()
  72.         self.nick = QLineEdit()
  73.         self.btn_connect = QPushButton("Conectar")
  74.        
  75.         hport = QHBoxLayout()
  76.         hhost = QHBoxLayout()
  77.         hnick = QHBoxLayout()
  78.         vbox = QVBoxLayout()
  79.        
  80.         hhost.addWidget(QLabel("Host:"))
  81.         hhost.addWidget(self.host)
  82.        
  83.         hport.addWidget(QLabel("Port:"))
  84.         hport.addWidget(self.port)
  85.        
  86.         hnick.addWidget(QLabel("Nick:"))
  87.         hnick.addWidget(self.nick)
  88.        
  89.         vbox.addLayout(hhost)
  90.         vbox.addLayout(hport)
  91.         vbox.addLayout(hnick)
  92.         vbox.addWidget(self.btn_connect)
  93.        
  94.         self.setLayout(vbox)
  95.        
  96.         self.btn_connect.clicked.connect(self.comprobar)
  97.    
  98.     def comprobar(self):
  99.         port = int(self.port.text().toAscii())
  100.         host = str(self.host.text().toAscii())
  101.         nick = str(self.nick.text().toAscii())
  102.        
  103.         if not nick:
  104.             nick = host
  105.        
  106.         if port and host:
  107.             self.emit(SIGNAL("conexion"), (host, port), nick)
  108.  
  109. class Escuchar(QThread):
  110.     def __init__(self, sck):
  111.         QThread.__init__(self)
  112.         self.sock = sck
  113.        
  114.     def run(self):
  115.         while True:
  116.             buff = self.sock.recv(10024).strip()
  117.             serialized = pickle.loads(buff)
  118.             time.sleep(0.3)
  119.             self.emit(SIGNAL("message"), serialized)
  120.    
  121.     def __del__(self):
  122.         self.wait()
  123.  
  124. App = QApplication(sys.argv)
  125. GUI = Gui("192.168.1.7", 9001)
  126. GUI.show()
  127. App.exec_()

Saludos!

Desconectado alexander1712

  • *
  • Underc0der
  • Mensajes: 851
  • Actividad:
    0%
  • Reputación -2
    • Ver Perfil
    • El blog del programador
    • Email

Re:[PyQt4] Chat multiconexión

  • 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!

Desconectado Once

  • *
  • Underc0der
  • Mensajes: 391
  • Actividad:
    0%
  • Reputación 0
  • Twitter: @don_once
    • Ver Perfil
    • El blog de Once

Re:[PyQt4] Chat multiconexión

  • en: Noviembre 18, 2013, 10:36:11 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!

Es verdad brother, por eso me gusta revisar de vez en cuando mis backups.

PD: Que bueno verte de nuevo bro.

Saludos!

 

[Codigo] Simple chat

Iniciado por blozzter

Respuestas: 2
Vistas: 2730
Último mensaje Agosto 29, 2011, 04:21:39 pm
por blozzter
[PyQT4] Memoriza :: "Entrenando tu memoria" :: JaAViEr

Iniciado por JaAViEr

Respuestas: 0
Vistas: 1754
Último mensaje Mayo 15, 2015, 12:52:46 pm
por JaAViEr
[Código-PyQT4] View Source - JaAViEr

Iniciado por JaAViEr

Respuestas: 1
Vistas: 2087
Último mensaje Julio 02, 2011, 03:07:23 am
por JaAViEr
[Código-PyQT4] Html Helper - JaAViEr

Iniciado por JaAViEr

Respuestas: 0
Vistas: 2414
Último mensaje Agosto 21, 2011, 09:18:28 pm
por JaAViEr
Python QT: Primeros pasos en PyQT4 [PDF]

Iniciado por LucaSthefano

Respuestas: 3
Vistas: 2748
Último mensaje Noviembre 28, 2012, 10:06:21 pm
por Acidkode