2013-10-23 18 views
0

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

这第二种方法看起来更好,但执行差很多。

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

谢谢!

回答

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