我有一堆数据通过套接字连接进入,对于我的应用程序,我只关心最近的数据。消息是JSON格式的文本字符串,由换行符分隔。我想弄清楚的是只读最新消息的干净而有效的方式。消息每隔30ms左右进入一次。我的问题之一是在我的代码加载之前开始的消息,所以可能会有很多无用的消息,我不希望它通过。如何在Python/Jython中只读取套接字中的最新数据和/或清空套接字
有什么建议吗?
我使用jython,它非常类似于python,除了一些不方便不起作用的东西,但它对套接字来说没问题。
的是我迄今为止尝试过的代码片段:
# ...
# This code is repeatedly called every 30 ms or so
in_file = sock_in.makefile('r')
data_in = None
try:
data_in = json.loads(in_file.readline())
except JSONDecodeError:
try:
data_in = json.loads(in_file.readline())
except JSONDecodeError:
print("ERROR: malformed message, dropping data")
return
# do stuff with data_in
# ...
这基本上是从套接字中,如果发生抢缺少一些消息的一大块,它会再试一次抓起下一个(到目前为止每次都有效)。 我的问题是,如果消息传入太快(它们是),它似乎是先读取较旧的消息,而只有最新的消息才有用。 这种方法似乎工作正常,但我有一种感觉可能会好很多。
我想另一件事是这样的:
# ...
self.buf = ""
# ... This code is repeatedly called every 30ms or so
self.read_socket(self.sock_in)
data_in = json.loads(self.odom_str)
# ...
def read_socket(self, sock):
out = self.buf
while True:
try:
data = sock.recv(64)
except:
return False
if not data:
break
nl = data.find('\n')
if nl >= 0:
nl += 1
out += data[:nl]
self.buf = data[nl:]
del data
break
out += data
self.odom_str = out
return True
这第二种方法看起来更好,但执行差很多。
有没有办法在成功读取后清空套接字文件?或从它的最后读取一个简单的方法?或者,这实际上是从最后阅读,我感到困惑? 我是使用套接字的新手,很多我一直在尝试的东西可能都是可怕的风格,所以任何帮助都将不胜感激:)
谢谢!