我有一堆数据通过套接字连接传入,对于我的应用程序,我只关心最新的数据。消息是 json 格式的文本字符串,由换行符分隔。我想弄清楚的是一种干净有效的方式来阅读最新消息。消息大约每 30 毫秒左右出现一次。我的问题之一是消息在我的代码加载之前就开始出现,所以可能有很多我不希望它通过的无用消息。
有什么建议么?
我正在使用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
第二种方法看起来更好,但性能更差。
成功读取后有什么方法可以清空套接字文件吗?还是从末尾阅读的简单方法?还是这实际上是从最后阅读的,我感到困惑?我是使用套接字的新手,我一直在尝试的很多东西可能都是可怕的风格,所以任何帮助将不胜感激:)
谢谢!