PyQt5之使用Twisted实现两个窗口之间的通信(一)

最近做项目也基本步入后端开发的阶段了,之前简单学习了下数据库的知识,实现了些增删改查的功能,这几天有忙着搞通信的部分了,需要实现两个软件之间的通信,因为之前从未接触过通信部分,而且PyQt的通信网上资料也不多,老师还选了个冷门的Twisted框架,所以学起来比较费劲,好在目前也实现了基本的通信,所以在这里记录一下我们这几天的成果!

一、构建客户端和服务器端文件

因为这个项目使用的C/S架构,所以通信部分自然需要一个软件作为服务器端实时监听,另一个作为客户端与服务器进行连接并互相收发消息。而Twisted框架有个有点就是采用异步传输的通信方式,这样就不需要为每个通信模块再单独建立一个线程,比较方便,缺点就是网上资料太少,尤其是与PyQt相关的,更是屈指可数,并且也不太符合我们的要求!经过几天的研究,我们总算是结合现有的资料,研究出了一份比较适用的方法!首先,需要在Python中安装Twisted库,pip install twisted 再加个镜像就可以很快安装好了。
安装好了后就可以分别建立客户端和服务器端了,其实就是两个py文件,分别定义客户端和服务器的类,重写一些方法,然后在界面文件中调用这些需要的方法即可。这两个文件的代码我就不详细解释了,比较复杂(会加一些注释),我只介绍几个关键的我们可能需要自己改变的函数,其它的部分直接照搬即可,代码如下所示:
服务器部分:

# -*- coding: utf-8 -*-
from PyQt5.QtCore import *
# 广播服务器端
from twisted.internet.protocol import Protocol
from twisted.internet.protocol import Factory
from twisted.internet.endpoints import TCP4ServerEndpoint
from twisted.internet import reactor

clients = []


# 定义Protocol的子类Spreader,并实现需要重载的方法
class Spreader(Protocol, QObject):
    # 向界面传递信号的方法,采用字节流的格式传递
    SigMessageToWindow = pyqtSignal(bytes)

    def __init__(self, factory):
        super(Spreader, self).__init__()
        self.factory = factory
        self.connect_id = None

    # 记录连接的客户端数,一旦与一个客户端建立便调用一次该方法
    def connectionMade(self):
        self.factory.numProtocols = self.factory.numProtocols + 1
        self.connect_id = self.factory.numProtocols
        print("new connect: %d" % self.connect_id)
        clients.append(self)

    # 执行与connectionMade相反的操作
    def connectionLost(self, reason):
        clients.remove(self)
        print("lost connect: %d" % self.connect_id)

    # 用于接收客户端消息的函数
    def dataReceived(self, message):
        print("receiving message from %s : %s" % (self.connect_id, message))
        self.SigMessageToWindow.emit(message)
        print("data is received from client")

    # 定义一个发送消息的函数
    def sendMessage(self, message):
        if self.transport.connected:
            self.transport.write(message)
            print("{} in server".format(message))


# Factory子类对Protocol起管理作用
class SpreadFactory(Factory):
    def __init__(self):
        # 将客户端数量置0
        self.numProtocols = 0
        self.protocol = Spreader(self)

    def buildProtocol(self, addr):
        return self.protocol

客户端部分:

# -*- coding: utf-8 -*-
from twisted.internet.protocol import Protocol, Clie
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值