重构同步客户端以使用异步Twisted调用

0 投票
1 回答
970 浏览
提问于 2025-04-17 07:51

我在开发一个网络应用的时候,发现了Twisted这个工具。最开始我用原始的socket通信做了一个可以工作的客户端和服务器,但后来决定使用Twisted,这样可以让服务器同时处理多个连接,而不需要等待每个连接完成。Twisted服务器和下面这个用原始socket的客户端类连接得很好:

class Client:
  def __init__(self, backend, port=22220):
    import socket
    self.role_buf = 4096
    self.buf = 1024
    self.addr = (backend, port)
    self.TCPSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    self.TCPSock.connect(self.addr)

  def getRoleList(self):
    self.TCPSock.send("RLP")
    data = self.TCPSock.recv(self.role_buf)
    return data.split("|")

  def getServer(self, roleindex=0):
    self.TCPSock.send(roleindex)
    ip = self.TCPSock.recv(self.buf)
    self.TCPSock.close()
    return ip

我想把客户端的代码改成使用Twisted的干净socket和反应器(reactor)抽象。我的目标是能够在基于Qt的客户端界面(使用PyQt)中实例化这个客户端类,通过调用getRoleList()getserver()来获取用户的事件驱动(异步)输入。我不想使用PyQt自带的socket/反应器实现,而是希望使用一个库来处理我的网络通信。

这样做可行吗?如果可以,我该怎么做呢?我觉得应该是可行的,但我花了不少时间研究和阅读Twisted的文档,包括这些很棒的教程,却还是没能从中找到具体的实现方法。也许我做了什么傻事,需要有人提醒我?

典型的服务器/客户端交互:

服务器总是监听22220端口,当它收到来自客户端的“角色列表请求”时,会把它的(动态的)角色选择列表推送给客户端。客户端接着会在界面上显示这些角色选择,用户选择他们想要的角色,然后客户端把这个请求发送回服务器。服务器随后会根据用户的具体选择返回相应的数据。

1 个回答

2

如果你想快速了解Twisted的客户端和服务器信息,最好的办法就是看看Twisted的使用指南:

http://twistedmatrix.com/documents/current/core/howto/index.html

特别是这里:编写TCP服务器(看起来你已经搞定了这个)

还有:编写TCP客户端

当你对这些内容有了基本了解后,可以从这里获取第三方的qtreactor:

https://github.com/ghtdak/qtreactor

然后用它来把Qt和Twisted结合在你的客户端中。这个reactor可以让PyQt和Twisted在同一个应用程序中并行运行,而不会互相干扰。

撰写回答