gpt4 book ai didi

Python 扭曲 - 需要遍历所有连接并找到客户端

转载 作者:太空宇宙 更新时间:2023-11-04 09:17:47 25 4
gpt4 key购买 nike

我正在尝试创建一个简单的代金券程序。

客户端连接到服务器并询问凭证上是否还有时间,如果是,服务器会响应多少时间。

我控制服务器和客户端,客户端也由我编写代码。

现在这就是我的服务器端,客户端是不言自明的。

其中最大的缺陷是,如果 2 个客户端使用相同的凭单代码连接,他们都可以访问,因为服务器不会检查是否存在具有该代码的事件客户端。

任何人都可以解释或提供有关这如何可能的文档吗?

#!/usr/bin/env python

from twisted.internet import reactor, protocol

class Responder(protocol.Protocol):

def dataReceived(self, data):
# check the voucher code, and return disabled if its out of time or not there. Otherwise return time left.
if data.startswith("check="):
param, vcode = data.split("=")
checkcode = SQLConnect("check", vcode, vcode)
if checkcode == "disabled":
self.transport.write("disabled")
else:
self.transport.write(str(checkcode))
# Update time left.
if data.startswith("update="):
param, vcode, vtime = data.split("=")
SQLConnect("update", vcode, vtime)

def main():
factory = protocol.ServerFactory()
factory.protocol = Responder
reactor.listenTCP(6500,factory)
reactor.run()

if __name__ == '__main__':
main()

最佳答案

如果凭证在客户端检查时变为“正在使用”,然后在客户端断开连接时变为未使用,听起来您只需要保留一组凭证,在检查完成时将其添加到其中并从中删除客户端断开连接。您可以将其保留在工厂中,以便在所有客户端连接之间共享。例如:

#!/usr/bin/env python

from twisted.internet import reactor, protocol

class Responder(protocol.Protocol):
def connectionMade(self):
self.vcode = None

def dataReceived(self, data):
# check the voucher code, and return disabled if its out of time or not there. Otherwise return time left.
if data.startswith("check="):
param, vcode = data.split("=")
if vcode in self.factory.activeVouchers:
self.transport.write("in use")
return
self.factory.activeVouchers.add(vcode)
self.vcode = vcode

checkcode = SQLConnect("check", vcode, vcode)
if checkcode == "disabled":
self.transport.write("disabled")
else:
self.transport.write(str(checkcode))
# Update time left.
if data.startswith("update="):
param, vcode, vtime = data.split("=")
SQLConnect("update", vcode, vtime)

def connectionLost(self, reason):
if self.vcode is not None:
self.factory.activeVouchers.remove(self.vcode)

def main():
factory = protocol.ServerFactory()
factory.activeVouchers = set()
factory.protocol = Responder
reactor.listenTCP(6500,factory)
reactor.run()

if __name__ == '__main__':
main()

Responder 上新的 vcode 属性让 activeVouchers 集在客户端断开连接时得到更新(这会触发 Responder.connectionLost 调用)。 Responder.dataReceived 开头附近的附加检查会在凭证被使用时将其添加到该集合,并防止任何正在使用的凭证被认领。

除此之外,您可能还需要考虑其他几件事。首先,您可能应该使用 twisted.protocols.basic.LineOnlyReceivertwisted.protocols.basic 中的其他协议(protocol)之一,而不仅仅是 Protocol .只要通过网络接收到任何字节,就会调用 dataReceived。由于 TCP 是面向流的传输而不是面向消息的传输,您可能会以 dataReceived("chec") 之类的调用结束,紧接着是 dataReceived("k=somecode")。由于您的 dataReceived 现在已实现,因此不会处理这种情况,客户端也不会收到任何响应。 LineOnlyReceiver 添加了基于行的框架,因此像“check=somecode\r\n”这样的字节可以被解释为一个完整的消息,并且“check=somecode”在单个 lineReceived 调用。

其次,SQLConnect 看起来可能会执行一些阻塞 I/O。如果这是真的,则意味着您的服务器将无法很好地处理并发客户端请求,因为任何阻塞都会阻止处理所有新事件,包括来自不同客户端的事件。您可能想查看非阻塞 SQL API 的 twisted.enterprise.adbapi

关于Python 扭曲 - 需要遍历所有连接并找到客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6797434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com