重构同步客户端以使用异步Twisted调用
我在开发一个网络应用的时候,发现了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 个回答
如果你想快速了解Twisted的客户端和服务器信息,最好的办法就是看看Twisted的使用指南:
http://twistedmatrix.com/documents/current/core/howto/index.html
特别是这里:编写TCP服务器(看起来你已经搞定了这个)
还有:编写TCP客户端
当你对这些内容有了基本了解后,可以从这里获取第三方的qtreactor:
https://github.com/ghtdak/qtreactor
然后用它来把Qt和Twisted结合在你的客户端中。这个reactor可以让PyQt和Twisted在同一个应用程序中并行运行,而不会互相干扰。