0

我有一堆数据通过套接字连接传入,对于我的应用程序,我只关心最新的数据。消息是 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

第二种方法看起来更好,但性能更差。

成功读取后有什么方法可以清空套接字文件吗?还是从末尾阅读的简单方法?还是这实际上是从最后阅读的,我感到困惑?我是使用套接字的新手,我一直在尝试的很多东西可能都是可怕的风格,所以任何帮助将不胜感激:)

谢谢!

4

1 回答 1

0

到目前为止,我想出的最好的方法是将端口设置为非阻塞,然后连续读取直到没有更多数据,然后使用读取的最后一段数据。代码看起来像这样:

  self.sock_in.setblocking(0)

# ...

  while True:
    if self.read_socket( self.sock_in ):
      try:
        data_in = json.loads( self.odom_str )
      except JSONDecodeError:
        break
      self.sensor_data = data_in
    else:
      break
于 2013-10-28T18:14:59.463 回答