2013-10-23 20 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