linux - 如何在 Python/Jython 中仅读取套接字中的最新数据和/或清空套接字

标签 linux sockets python-2.7 jython-2.5

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

这基本上是从套接字读取的,如果它碰巧抓取了丢失某些消息的 block ,它会再次尝试并抓取下一个(到目前为止每次都有效)。 我的问题是,如果消息传入得太快(事实确实如此),它似乎会先阅读较旧的消息,而只有最新的消息才有用。 这种方法似乎很有效,但我有一种感觉还可以更好。

我尝试的另一件事是:

   # ...
   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

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

成功读取后是否有某种方法可以清空套接字文件?或者有一种简单的方法可以从末尾开始阅读?或者这实际上是从最后读到的,而我感到困惑? 我是使用套接字的新手,我一直在尝试的很多事情可能都是可怕的风格,因此任何帮助将不胜感激:)

谢谢!

最佳答案

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

  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

关于linux - 如何在 Python/Jython 中仅读取套接字中的最新数据和/或清空套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19531436/

相关文章:

python - 循环遍历 Python 字典

python - 反编译 Python 2.7 .pyc

python - 在命令行中将文件名传递给 python 脚本

c - 如何在 C 中打印程序计数器的精确值

python - 没有密码验证的Sendmail (Python 2.4)

c - 递归复制功能将数据从套接字复制到文件。怎么了?

C# 原始套接字端口转发

linux - 脚本只处理输入文件的第一行

linux - 系统如何监听文件变化?

java - 套接字传输文件