- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经用Twisted实现了一个服务器程序。我使用basic.lineReceiver
和dataReceived
方法从多个客户机接收数据。另外,我使用protocol.ServerFactory
来跟踪连接的客户端。服务器向每个连接的客户端发送一些命令。基于服务器从每个客户端得到的响应,它(服务器)应该执行一些任务。因此,我想到的最佳解决方案是为接收到的消息创建一个缓冲区作为python列表,每当服务器端的函数想知道来自客户端的响应时,它们都会访问缓冲区列表(该客户端)的最后一个元素。
事实证明,这种方法是不可靠的。第一个问题是,由于使用了TCP流,有时消息会合并(我可以为此使用分隔符)。其次,接收到的消息有时不在其适当的序列中。第三,网络通信似乎太慢,因为当服务器最初试图访问缓冲列表的最后一个元素时,列表是空的(这表明缓冲区上的最后一条消息可能不是对最后发送的命令的响应)。
您能告诉我在上述问题中使用dataReceived
或其等价物的最佳包裹是什么吗?提前谢谢你。
编辑1:回答-虽然我接受@Jean Paul Calderone的回答,因为我确实从中学到了这一点,但我想补充一下,在我自己对Twisted文档的研究中,我了解到为了避免服务器通信的延迟,应该在dataReceived()或lineReceived()函数的末尾使用return
,这解决了我的部分问题。其余的,都在回答中解释过了。
最佳答案
我已经用Twisted实现了一个服务器程序。我使用basic.lineReceiver和dataReceived方法从多个客户端接收数据。
这是一个错误——不幸的是,在Twisted的许多协议实现中,由于错误地使用继承作为构建越来越复杂的行为的机制而导致的一个常见错误。当您使用twisted.protocols.basic.LineReceiver
时,dataReceived
回调不适合您。LineReceiver.dataReceived
是LineReceiver
的实现细节。您的回拨是LineReceiver.lineReceived
。LineReceiver.dataReceived
看起来它可能适合您—它不是以下划线或任何内容开头—但它不是。dataReceived
是如何从其传输接收信息的。它是LineReceiver
的公共方法之一,即传输和协议之间的接口,用于解释通过该传输接收的数据。是的,我刚才说了“公共方法”。问题是它是为了别人的利益而公开的。这是令人困惑的,也许没有沟通好,因为它可以。毫无疑问,这就是为什么它是一个Frequently Asked Question。
事实证明,这种方法是不可靠的。第一个问题是,由于使用了TCP流,有时消息会合并(我可以为此使用分隔符)。
使用IProtocol
就是发生这种情况的原因。dataReceived
已经为您实现了基于分隔符的解析。这就是为什么它被称为“行”接收器-它接收由分隔符分隔的行。如果覆盖LineReceiver
而不是lineReceived
,则将调用接收到的每一行,而不管TCP如何拆分或粉碎它们。
其次,接收到的消息有时不在其适当的序列中。
TCP是一种可靠的、有序的、面向流的传输。”“有序”意味着字节的到达顺序与它们的发送顺序相同。换言之,当您dataReceived
时,可以保证接收者在收到“y”之前收到“x”(他们可能在对write("x"); write("y")
的同一个调用中收到“x”和“y”),但是如果他们收到了,数据肯定是“xy”而不是“yx”;或者他们可能在对recv()
的两个调用中收到两个字节,如果他们收到了,第一个recv()
肯定是“x”,第二个肯定是“y”,而不是相反的方向)。
如果字节的到达顺序与您发送的顺序不同,则可能有另一个错误使其看起来像正在发生,但实际上并非如此。您的平台的TCP堆栈很可能非常接近无错误,特别是它可能没有TCP数据重新排序错误。同样,这个扭曲的区域也经过了很好的测试,可能工作正常。这会在应用程序代码中留下一个错误,或是对观察结果的误解。也许您的代码并不总是将数据追加到列表中,或者数据没有按您期望的顺序发送。
另一种可能性是,您正在讨论数据通过多个单独的TCP连接到达的顺序。TCP仅通过单个连接进行排序。如果您有两个连接,那么很少(如果有的话)可以保证数据到达它们的顺序。
第三,网络通信似乎太慢,因为当服务器最初试图访问缓冲列表的最后一个元素时,列表是空的(这表明缓冲区上的最后一条消息可能不是对最后发送的命令的响应)。
什么定义“太慢”?网络和网络一样快。如果这对你来说不够快,找一块更胖的铜。听起来你真正的意思是,你的服务器有时希望数据在实际到达之前到达。这并不意味着网络太慢,但是,这意味着服务器没有正确的事件驱动。如果您正在检查缓冲区,但没有找到预期的信息,那是因为您在事件发生之前检查了缓冲区,该事件通知您该信息的到达。这就是为什么Twisted有所有这些回调方法-recv()
,dataReceived
,lineReceived
等。当调用connectionLost
时,这是一个事件通知,告诉您现在发生了一些事情,导致一行可用(为了方便,lineReceived
接受一个参数-一个表示当前可用行的对象)。
如果有一些代码要在行到达时运行,请考虑将该代码放入lineReceived
方法的实现中。这样,当它运行(响应接收到的行)时,您可以100%确定您有一个要操作的行。你也可以确信它会尽快运行(一旦线路到达),但不会很快。
关于python - 如何使用Twisted中收到的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27042943/
我正在尝试发送 RFC5424 中定义的结构化数据从 Twisted 到系统日志。我在 Ubuntu 上,系统日志实现是 rsyslog。 我正在使用“twistd --syslog”运行扭曲的应用程
摘要:无法自动向 Twisted 的检修孔发出命令。寻求解决方案/建议。 Twisted 有一个很棒的功能,称为 manhole。它允许用户通过 ssh 连接到当前正在运行的 Twisted 服务器并
我正在尝试发送 RFC5424 中定义的结构化数据从 Twisted 到系统日志。我在 Ubuntu 上,系统日志实现是 rsyslog。 我正在使用“twistd --syslog”运行扭曲的应用程
我正在尝试使用扭曲的 spawnProcess 启动一个进程,并使用 psutil 每 5 秒记录一次资源使用情况。首先,我尝试使用以下代码获取生成的进程的可执行文件名称: #!/usr/bin/py
Azure 网站能否托管 Twisted 应用程序?例如像这样的东西: from twisted.internet import reactor from twisted.web import ser
有没有办法限制 Twisted http 客户端的下载速率?如果没有,在 Twisted 中实现此类客户端的最简单方法是什么? 最佳答案 Twisted 中的流控制最常使用 IProducer.pau
我的基于 Twisted 的客户端循环发送 UDP 数据包。因此,我正在使用 DatagramProtocol 类。这是来源: #!/usr/bin/python # -*- coding: utf-
raven 有很多集成,包括 python 日志记录。一方面,twisted 不使用python 的日志记录。而另一方面,在twisted 中,raven 并没有直接的整合。 那么在基于扭曲的设置中使
有人告诉我,Twisted基于库Ampoule是创建在不同计算机上执行的进程池的好方法。然而,没有相关文档,Ampoule 的示例也没有说明这一点。 我对类似于 stdlib multiprocess
Twisted 最近推出了一个新的日志记录模块:twisted.logger。我已经通读了文档 [1],但我一直无法找到设置实际日志级别的位置。关于日志观察者[2] 的部分建议,如果您显式配置自己的
我想问一个关于如何关闭扭曲连接的问题 RPC . 我知道有人问过类似的问题,但似乎没有回答我的问题。 我正在做一些基本的连接,如下图所示: cfactory = pb.PBClientFactory(
我正在使用 Twisted 编写代码,但在为我的扭曲互联网延迟变量想出一个合理的变量名时遇到了麻烦。这是我的候选人: d :太通用,太短,违反了 pylint 规则 C0103。 def :与内置函数
我正在为 Web 服务器的静态部分使用 Twisted Web static.File 资源。 对于开发,我希望能够添加新文件或修改当前静态文件,而无需重新启动 Twisted 网络服务器。 我在 g
我想使用 Twisted 重建现有应用程序的通信部分。这个应用程序确实从客户端向服务器发送数据,只是这样,服务器不发送任何东西。 我如何使用 Twisted 的事件驱动概念来实现这一目标?我目前使用
我开始考虑通过扩展当前的 Twisted FTP 来实现显式 FTP。 大部分代码都很简单,实现 AUTH、PBSZ、PROT 很容易,我得到了一个有效的安全控制 channel 。 我的问题是数据通
我想实现 WebRTC 对等连接。我不知道如何设置 ICE 服务器或应该使用什么工具。任何人都可以给我建议吗?非常感谢。 最佳答案 实际上你不需要编写自己的 STUN/TURN 服务器 有很多现成的解
正如标题所示,ProcessProtocol 类上的这两个函数有什么区别?关于什么时候应该使用一种而不是另一种的文档有点稀疏? 我最好寻找一些可以证明这一点的用例示例。 最佳答案 我猜文档在这一点上有
使用下面的代码,我似乎可以相当轻松地使用 multiprocessing.reduction 在子进程中重建套接字.. import socket,os import multiprocessing
我正在尝试在 python 上使用 twisted 编写服务器。这是我文件的头部: from twisted.internet.protocol import Factory, Protocol fr
我使用 Twisted 制作了一个简单的 http 服务器,它发送 Content-Type: multipart/x-mixed-replace header 。我正在使用它来测试我想设置为接受长期
我是一名优秀的程序员,十分优秀!