- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- from PyQt4 import QtGui
- import sys, qt4reactor
- qt4reactor.install()
- app = QtGui.QApplication(sys.argv)
- from twisted.internet.protocol import Factory
- from twisted.protocols.basic import LineOnlyReceiver
- from twisted.internet import reactor
- class Core(LineOnlyReceiver): #or class Core(Protocol):
- def getId(self):
- return str(self.transport.getPeer())
- def connectionMade(self):
- self.factory.window.protocol = self
- self.factory.addClient(self)
- self.log('New User Login:%s!' % self.getId())
- def connectionLost(self, reason):
- self.log('%s disconnected!' % str(self.transport.client))
- self.factory.delClient(self)
- def dataReceived(self, data):
- msg = "%s:%s" % (self.transport.client[0], data)
- self.factory.sendAll(msg)
- self.log(msg)
- def log(self, msg):
- self.factory.window.sendMessage(msg)
- class CoreFactory(Factory):
- protocol = Core
- def __init__(self, window):
- self.window = window
- self.clients = []
- def addClient(self, client):
- self.clients.append(client)
- def delClient(self, client):
- self.clients.remove(client)
- def sendAll(self, data):
- for x in self.clients:
- x.transport.write(data)
- class Frame(QtGui.QFrame):
- def __init__(self):
- super(Frame, self).__init__()
- self.btn_listen = QtGui.QPushButton(u'侦听', self)
- self.btn_listen.clicked.connect(self.btn_listen_click)
- self.btn_stop = QtGui.QPushButton(u'停止', self)
- self.btn_stop.clicked.connect(self.btn_stop_click)
- self.btn_radio = QtGui.QPushButton(u"广播", self)
- self.btn_radio.clicked.connect(self.btn_radio_click)
- self.text_port = QtGui.QLineEdit("1250", self)
- self.text_msg = QtGui.QLineEdit("hello", self)
- self.view = QtGui.QTextEdit(self)
- layout = QtGui.QGridLayout()
- layout.addWidget(self.text_port, 0, 0)
- layout.addWidget(self.btn_listen, 0, 1)
- layout.addWidget(self.btn_stop, 0, 2)
- layout.addWidget(self.view, 1, 0, 1, 0)
- layout.addWidget(self.text_msg, 2, 0)
- layout.addWidget(self.btn_radio, 2, 1, 1, 2)
- self.setLayout(layout)
- self.core_factory = CoreFactory(self)
- self.protocol = None
- def sendMessage(self, msg):
- self.view.append(msg)
- def btn_listen_click(self):
- port = int(self.text_port.text())
- reactor.listenTCP(port, self.core_factory)
- print "start running..."
- reactor.run()
- def btn_stop_click(self):
- reactor.stop()
- def btn_radio_click(self):
- msg = str(self.text_msg.text())
- self.core_factory.sendAll(msg)
- def closeEvent(self, event):
- print('Attempting to close the main window!')
- self.btn_stop_click()
- event.accept()
- if __name__ == '__main__':
- frm = Frame()
- frm.show()
- sys.exit(app.exec_())
- #该片段来自于http://www.codesnippet.cn/detail/221120137411.html
来源: http://www.codesnippet.cn/detail/221120137411.html