- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我找到了一份构建长拉式 TCP 套接字服务器作为设备服务器的工作。我开发的时候选择了Twisted。它适用于我的 Python 设备模拟器。然而,真实设备发送连接(或组合)的 TCP 数据包。我知道这在实际网络和设备中是正常的,尽管 TCP 数据包很短。
它有三个框架结构:
\xFDAA + "realtime_data" + \xCCDD (length is fixed at 150B)
\xFDCC + "extra_data" + \xCCDD (length is fixed at 190B)
\xFDCC + "extra_data" + \xCCDD (length is fixed at 192B)
很明显,\xFDAA\xFDCC是header,\xCCDD是EOT。所以他们确实有束缚。并且它们还隐含了固定长度,没有在协议(protocol)本身中定义。
但是,我不知道如何使用现有的 Twisted 方法处理自定义框架的串联数据包。在我的开发过程中,我使用了 dataReceiver。
到目前为止,我正在尝试解析数据包并将其存储在协议(protocol)工厂的缓冲区中。当每个新数据包到达时,我会将之前缓冲的数据与新数据组合起来进行解析(如果连接则合并,如果收到组合数据包则将它们分开......但这看起来很脏)。
我查看了 twistedmatrix.com 的常见问题解答。它推荐了以下解决方案:
LineReceiver (with \r\n ending chars)
NetstringReceiver (with callback for every string received)
Int8/16/32Receiver (with prefix length information)
然后还推荐使用 AMP 和 PB 高级消息传递。
我想听听 twisted 专家关于如何使用 twisted 官方实现它的任何建议。 URL/演示代码非常有用。
最佳答案
LineReceiver
、NetstringReceiver
、Int8/16/32Receiver
的集合都没有,AMP
或 PB
适用于您的问题,因为它们都是实现特定的框架(在后两者的情况下,消息传递)协议(protocol)。相反,您有一个要实现的自定义协议(protocol)。
幸运的是,这相对简单:Twisted 通过您的IProtocol
实现的 dataReceived
方法。
处理这类事情的最好方法实际上是实现一个简单的首先是功能,而不是担心它究竟是如何被插入的进入扭曲。在您的情况下,您需要一个解析协议(protocol)的函数;但是,由于 dataReceived
可能会向您发送部分数据包,因此您需要确保该函数返回 2 个东西:解析后的数据,以及任何剩余的缓冲。一旦你有了这样的功能,你就可以将它插入到 Protocol
子类化很容易。
您对协议(protocol)的解释不是很清楚,所以这可能不是很清楚正确,但我将您对消息格式的描述解释为:
octet 0xFD
octet 0xAA
150 octets of "realtimeData"
octet 0xCC
octet 0xDD
octet 0xFD
octet 0xCC
190 octets of "extraData1"
octet 0xCC
octet 0xDD
octet 0xFD
octet 0xCC
192 octets of "extraData2"
octet 0xCC
octet 0xDD
换句话说,单个协议(protocol)消息的长度为 544 字节,并且包含 3必须正确的字段和 12 个字节的填充。
所以让我们首先编写一个 Message
类来表示一 strip 有这些的消息三个字段,使用标准库struct
模块解析序列化它的领域:
from struct import Struct
class Message(object):
format = Struct(
"!" # Network endian; always good form.
"2s" # FD AA
"150s" # realtimeData
"4s" # CC DD FD CC
"190s" # extra1
"4s" # CC DD FD CC
"192s" # extra2
"2s" # CC DD
)
def __init__(self, realtimeData, extra1, extra2):
self.realtimeData = realtimeData
self.extra1 = extra1
self.extra2 = extra2
def toBytes(self):
return self.format.pack(
b"\xFD\xAA", self.realtimeData, b"\xCC\xDD\xFD\xCC", self.extra1,
b"\xCC\xDD\xFD\xCC", self.extra2, b"\xCC\xDD"
)
@classmethod
def fromBytes(cls, octets):
[fdaa, realtimeData, ccddfdcc, extra1, ccddfdcc2, extra2,
ccdd] = cls.format.unpack(octets)
# verify message integrity
assert fdaa == b"\xFD\xAA"
assert ccddfdcc == b"\xCC\xDD\xFD\xCC"
assert ccddfdcc2 == b"\xCC\xDD\xFD\xCC"
assert ccdd == b"\xCC\xDD"
return cls(realtimeData, extra1, extra2)
@classmethod
def parseStream(cls, streamBytes):
sz = cls.format.size
messages = []
while len(streamBytes) >= sz:
messageData, streamBytes = streamBytes[:sz], streamBytes[sz:]
messages.append(cls.fromBytes(messageData))
return messages, streamBytes
这里与 Twisted 接口(interface)的重要部分是最后的parseStream
方法,将一堆字节变成一堆消息,以及尚未解析的剩余字节。然后我们可以有一个 Protocol
理解实际的网络流,如下所示:
from twisted.internet.protocol import Protocol
class MyProtocol(Protocol):
buffer = b""
def dataReceived(self, data):
messages, self.buffer = Message.parseStream(self.buffer + data)
for message in messages:
self.messageReceived(message)
def messageReceived(self, message):
"do something useful with a message"
与其调用 self.messageReceived
,不如调用方法self
的一些其他属性,或者可能将 Message
对象中继到与此协议(protocol)关联的工厂。由你决定!既然你这么说你想“解析数据包并将其存储在工厂的缓冲区中”,也许你只想做 self.factory.messagesBuffer.append(message)
。希望这个看起来比你的“数据包连接”方法更干净,这不是描述清楚足以让我理解你认为令人反感的地方关于它。
关于python - 处理具有自定义帧结构的级联 TCP 流的扭曲协议(protocol)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33949409/
internal protocol Reducer { associatedtype S : BaseState associatedtype A : BaseActi
我在考虑我的应用程序中的验证检查,我认为在任何模型上调用 ValidatorFactory,实现 Validee,这意味着说哪个类负责 ValidatorCreation 听起来不错。但是下面的代码不
我已经定义了 2 个协议(protocol)。我需要第一个 (NameProtocol) 来执行 Equatable 协议(protocol)。而另一个类 (BuilderProtocol) 有一个返
在上传方面,WebDAV 协议(protocol)在哪些方面优于 HTTP 协议(protocol)。 Socket Upload 协议(protocol)和 WebDav Upload 协议(pro
是否可以在任何版本的 Swift 中扩展具有混合类/协议(protocol)类型约束的协议(protocol)?例如,仅当 Self 是 UIViewController 的子类并且符合 Protoc
我有一个协议(protocol) (ProtocolA),其中包含符合第二个协议(protocol) (ProtocolB) 的单个属性。 public protocol ProtocolA {
NSObject 协议(protocol)带有常用的协议(protocol)模板,但它似乎并不是协议(protocol)实际实现所必需的。将其排除在外似乎完全没有任何改变。那么,协议(protocol
我想根据这两种协议(protocol)的一般特征(例如开销(数据包)、安全性、信息建模和可靠性)来比较 OPC UA 和 MQTT。我在哪里可以找到每个协议(protocol)的开销和其他特性的一些示
使用 Swift 4,我正在尝试编写一个自定义协议(protocol),它提供对 @objc 协议(protocol)的一致性。 一些代码 更具体地说,我有一个自定义协议(protocol) Sear
我想定义一个在 Viper 架构中使用的协议(protocol),以使用具有弱属性的协议(protocol)在 Viper 组件之间建立连接,但我收到以下错误消息: 'weak' may only b
我在同一个网络中有 3 个 docker 容器: 存储 (golang) - 它提供了用于上传视频文件的 API。 主播 (nginx) - 它流式传输上传的文件 反向代理 (姑且称之为代理) 我有
我打算在我的项目中使用 php socket。它需要用户登录才能根据 session 填充内容。所以我的问题是,TCP/IP 协议(protocol)也像 HTTP 协议(protocol)一样为每个
目前,我的网站有两个版本。一种带有 https://-证书,一种没有。我想将我网站的 http 版本上的所有用户 301 重定向到我网站的 https://版本。 这似乎不可能,因为创建重定向将导致重
目前,我的网站有两个版本。一种带有 https://-证书,一种没有。我想将我网站的 http 版本上的所有用户 301 重定向到我网站的 https://版本。 这似乎不可能,因为创建重定向将导致重
我有一个 Swift View Controller ,它定义了一个在 Objective-C View Controller 中应该遵循的协议(protocol): ChildViewControl
我在客户那里有数百个硬件设备,需要通过telnet接口(interface)发送HTTP数据。 目标是等待数据的 Apache 2 Web 服务器和 PHP 脚本。 这已经可以正常工作了,但是我们发现
我发现如果我创建一个这样的协议(protocol): protocol MyProtocol { } 我不能这样做: weak var myVar: MyProtocol? 我找到了解决这个问题的方法
Xcode 基于模板生成了这个头文件: // this file is XYZAppDelegate.h #import @interface XYZAppDelegate : UIRespond
我在 github 中有一个公开的存储库,我正在开发一个开源应用程序,用于制作产品目录和小型 cms 内容。 我还有一个私有(private)仓库(不托管在github),它是在托管在github的开
您好,我想让别人看到私有(private) repo 代码,但不想公开我的 repo ,也不希望他们有能力更改内容。这可能吗?我查看了网站的“管理”部分,但没有找到合适的内容。谢谢大家。 最佳答案 据
我是一名优秀的程序员,十分优秀!