python - 我的 tcp 套接字连接的奇怪行为(一段时间后得到错误的数据)
问题描述
我有一个函数getData
,我想在while True
循环中连续运行。我认为代码没有问题,但我在下面发布了一个片段。当我运行代码时,我有以下奇怪的行为:
我得到了正确的数据,但仅限于特定时间。例如,我得到以下信息dict
:
{var1: 1290.0, var2: 100000.0, ....}
在一切正常的时间之后,将会有一个输出,例如:
{var2: 12e-39, var2:-1213141412343, ...}
我命名的列表#listofxy
仅包含参数的名称,例如
['ControlUnit/1', 'Calc_time(ms)', '时间', ...]
或者对于 dtypes
['Int','Float',...]
#Datapoints
是我必须请求为每个变量获取一个值(一个包)的字节数
服务器仅以每秒 8000 个包的速率发送原始数据(float 或 Int 属于变量并在 中标出#listofdtypes
)。每个包的每个变量都有一个值。我的电脑与服务器有以太网连接。
所以我不认为服务器有什么问题,因为它给了我正确的数据,直到某个时间。如果我的数据采集/代码出现问题,那么应该更早出现错误,并且每次运行时都不会同时出现错误。另外我不认为有位移,因为我使用了应该保证这一点的 TCP 协议。
我还在我的笔记本电脑上测试了这个程序并遇到了同样的问题。还有一位同事有一个程序可以从我的服务器获取数据并在 linux 上运行他的程序,但他没有这个问题。同时,我认为 windows 有一些奇怪的地方(还没有在 linux 机器上测试过),但我真的不知道。有人知道为什么会发生这种情况吗?
def getData(self):
dataB = b''
self.vari = {key: [] for key in #listofNames}
data = {key: [] for key in #listofNames2}
# get requested number of data bytes
dataB = dataB + self.sock_data.recv(#Datapoints)
while len(dataB) != #requestedLenght:
# check if requested number of data bytes and actual number of data bytes are the same
dataB = dataB + self.sock_data.recv(1)
dt_list = list((x, '<i4' if x == 'Int' else '<f4') for x in #listofdtypes)
for i in range(0, #Datapoints):
for j in range(0, len(#listofNames)):
"""
some code to decode the bytes with a numpy.frombuffer function
"""
for j in range(0, len(#listofNames)):
data[#listofNames[j] = self.vari[#listofNames[j]]
return data
解决方案
推荐阅读
- php - phpunit 功能测试断言数组
- octopus-deploy - 支持 Octopus Deploy 包元数据中的 repository 属性
- c++ - 如果 char 类型变量需要超过 1 个字符,为什么仍然可以编译?
- sql-server - 从sqlserver导出表并导入oracle?
- c# - GPIO 输入 C# UWP 的延长脉冲
- android - 为什么 exoplayer setPlayWhenReady(false) 方法不暂停歌曲?
- cordova - 在 phonegap/cordova 上构建 iOS 时缺少 cordova_plugins.js
- python - 如何使用python删除CSV文件中的某些行
- openssl - 如何在as400机器上编译open ssl 1.1.1D源码
- laravel - 如何在 laravel 5.2 中将 http 重定向到 https:www.domain.com