server.py
Código Python:
Ver original
import asyncore, socket clients = {} class MainSocketServer(asyncore.dispatcher): def __init__(self, puerto): asyncore.dispatcher.__init__(self) self.create_socket(socket.AF_INET, socket.SOCK_STREAM) self.bind(('', puerto)) self.listen(10) def handle_accept(self): newSocket, address = self.accept() clients[address] = newSocket print "Conectado desde", address SecondSocketServer(newSocket) class SecondSocketServer(asyncore.dispatcher_with_send): def handle_read(self): mensaje = self.recv(1000) if mensaje: clientes = clients.values() for cliente in clientes: cliente.send(mensaje+'\n') else: self.close() def handle_close(self): print "Desconectado desde", self.getpeername() del clients[self.getpeername()] MainSocketServer(9090) asyncore.loop()
client.py
Código Python:
Ver original
from PySide import QtGui, QtCore import socket, thread, sys socket_cliente = socket.socket() socket_cliente.connect(('', 9090)) class Window(QtGui.QMainWindow): def __init__(self): super(Window, self).__init__() self.socket() self.browser = QtGui.QTextBrowser() self.browser.backwardAvailable self.textEdit = QtGui.QTextEdit() self.textEdit.setMaximumSize(QtCore.QSize(400, 60)) self.connect(self.browser, QtCore.SIGNAL("returnPressed()"), self.enviar_mensaje) enviarB = QtGui.QPushButton("Enviar") enviarB.setMaximumSize(QtCore.QSize(400, 60)) enviarB.clicked.connect(self.enviar_mensaje) layoutINlayout = QtGui.QHBoxLayout() layoutINlayout.addWidget(self.textEdit) layoutINlayout.addWidget(enviarB) widget = QtGui.QWidget() self.setCentralWidget(widget) self.layout = QtGui.QVBoxLayout() self.layout.addWidget(self.browser) mainWindow = QtGui.QVBoxLayout() mainWindow.addLayout(self.layout) mainWindow.addLayout(layoutINlayout) widget.setLayout(mainWindow) self.setWindowFlags(QtCore.Qt.WindowTitleHint) def enviar_mensaje(self): mensaje = self.textEdit.toPlainText() socket_cliente.send(mensaje) def add_mensaje(self, mensaje): self.browser.setText(mensaje) def socket(self): def loop(): while True: mensaje = socket_cliente.recv(1000) if mensaje: self.add_mensaje(mensaje) thread.start_new_thread(loop, ()) app = QtGui.QApplication(sys.argv) w = Window() w.show() app.exec_()
El servidor en realidad no da ningun problema, pero el cliente me da el siguiente error:
Código:
Estuve revisando y este error da en la linea 53 de client.py al tratar de acceder a la funcion add_mensaje de la clase Window, no se si esque el thread no tiene permiso para acceder a las funciones de la clase o algo asi porque si cambio la linea 53 por "print mensaje", me imprime bien el mensaje que llega.QObject: Cannot create children for a parent that is in a different thread. (Parent is QTextDocument(0x95e29f0), parent's thread is QThread(0x9140ea0), current thread is QThread(0xafe009a0) Violación de segmento (`core' generado)
Espero me puedan ayudar con esto