我们(作为项目组)目前停留在如何处理我们服务器的实时数据的问题上。
我们每秒都会获得数据更新,我们希望将其插入到我们的数据库中(安全性目前不是问题,因为它是一个学校项目)。问题是在这里我们尝试使用python SockerServer和AsyncIO创建一个可以发送数据的TCP服务器。
我们使用不同的库等。但是我们坚持认为如果我们与客户端保持开放连接(在这种情况下硬件每秒发送数据),我们就无法拆分不同的JSON或XML消息。它们都加在一起。
我们知道为什么因为TCP只提供订单。
有关如何处理此问题的任何想法?这样发送的每条消息都会与其他消息分开。
如果我没记错的话,重新创建套接字将不是正确的选择。
答案 0 :(得分:1)
您需要做的是确保每封邮件都有明确的分隔符。例如,每条消息的前6个字符可以是消息的长度 - 无论从套接字读取什么,解码长度然后读取该字节数,并将数据发送到任何需要它的数据。另一种方法是,如果在内容中出现 never 的字符/字节,则在消息之前立即发送它 - 例如control-A(二进制值1)可以是leadin字符,并发送control-B(二进制值2)作为引出。服务器再次寻找这些框架消息。
答案 1 :(得分:0)
如果您无法更改客户端(发送数据的事物),那么您将不得不解析输入。您不能只为您无法控制的内容添加分隔符。
另一种方法是使用标头来编码将要发送的消息的大小。假设您使用4字节的标头,客户端首先向服务器发送一个标头,其中包含要发送的消息大小。然后客户端发送消息(最多4个演出或那里)。服务器知道它必须首先读取4个字节(标题)。它计算包含的头的大小n
然后从套接字缓冲区中读取n
个字节。保证您只读取您的信息。使用特殊分隔符很危险,因为您必须知道客户端可以发送的所有可能值。
这实际上取决于您收到的数据类型。什么类型的连接,延迟...如果您在数据包之间有1秒的暂停并且您的连接是一致的,那么您可能会先读取整个缓冲区一次以清除它,然后只要有可用的数据 - 读它并清除它的缓冲区。不是一个很好的方法,但它可能适用于你需要的东西 - 并且不涉及解析。