微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

lineReceived不被调用,仅dataReceived

如何解决lineReceived不被调用,仅dataReceived

我知道有人问过类似的问题here,但我仍在与以下问题作斗争:

我正在使用腻子作为telnet客户端,并且正在使用Win10。代码如下。当启动反应堆然后连接客户端时,键入每个字符后都会得到响应,并使用dataReceived函数将其打印出来。但是,我似乎永远无法启动函数lineReceived()。我还尝试了一个简单的聊天服务器示例,该示例使用lineReceived()函数可以很好地工作(并且该示例没有dataReceived()函数。我尝试注释掉dataReceived(),认为它可能掩盖了{{ 1}}。

在下面的代码中,我无法触发lineReceived(),在键入每个字符后仅触发lineReceived()

dataReceived()

解决方法

您用自己的LineReceiver子类覆盖了Protocol,而该子类没有lineReceived()方法。您只是给了我一个很好的理由,将模块路径用作名称空间而不是导入特定的对象:D

from twisted.protocols import basic
from twisted.internet import endpoints,protocol,reactor

class LnRcv(basic.LineReceiver):
    def lineReceived(self,line):
        print(line)

class DataFactory(protocol.Factory):
    protocol = LnRcv

server = endpoints.TCP4ServerEndpoint(reactor,10003)
server.listen(DataFactory())
reactor.run()

更新

我有一些空闲时间来修复您的代码。您的字符串/字节与原始代码中不在的所有未引用对象不匹配。这是一个应该起作用的示例,为您提供了基础。

from uuid import uuid4

from twisted.internet import reactor
from twisted.internet.endpoints import TCP4ServerEndpoint
from twisted.internet.protocol import Factory,Protocol
from twisted.protocols.basic import LineReceiver


class LnRcv(LineReceiver):
    # Client timeout period in seconds
    TIMEOUT = 10

    def timeOut(self):
       print ("Client: %s. %s" % (self.addr,'Connection Timed out' ))
       self.transport.loseConnection()

    def connectionMade(self):
        self.factory.NUM_CLIENTS += 1
        print(f"Connected......number of connections = {self.factory.NUM_CLIENTS}")
        peer = self.transport.getPeer()
        self.addr = f"{peer.host}:{peer.port}"
        self.name = uuid4().hex[:9].upper()
        self.transport.write(f"Hello! I temporarily set your ID to {self.name}. What is your name? ".encode("utf8"))
        # Start client timeout timer
        self.timeout = reactor.callLater(self.TIMEOUT,self.timeOut)

    def connectionLost(self,reason):
        self.factory.NUM_CLIENTS -= 1
        print(f"- {self.name} left because:\n{reason.getErrorMessage()}")
        print(f"- Client disconnected: - {self.addr}")
        print(f"- Number of connections = {self.factory.NUM_CLIENTS}")

    def lineReceived(self,line):
         self.sendLine(f"Welcome,{line.decode('utf8')}!".encode("utf8"))


class DataFactory(Factory):
    protocol = LnRcv
    NUM_CLIENTS = 0


def main():
    print("Started...Listening for incoming connections.")
    server = TCP4ServerEndpoint(reactor,10003)
    server.listen(DataFactory())
    reactor.run()


if __name__ == "__main__":
    main()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。