从sys.stdin读取没有换行符或EOF

时间:2012-09-06 20:39:34

标签: python tcp tcplistener xinetd

我想从我的gps-tracker收到数据。它通过tcp发送数据,所以我使用xinetd来监听一些tcp端口和python脚本来处理数据。这是xinetd config:

service gps-gprs
{
    disable     = no
    flags       = REUSE
    socket_type = stream
    protocol    = tcp
    port    = 57003
    user        = root
    wait        = no
    server      = /path/to/gps.py
    server_args     = 3
} 

在/ etc / services中配置

gps-gprs        57003/tcp           # Tracking system

Python脚本gps.py

#!/usr/bin/python
import sys

def main():
    data = sys.stdin.readline().strip() 
    #do something with data
    print 'ok'

if __name__ =='__main__':
    main()

跟踪器以原始文本发送数据字符串,如

$GPRMC,132017.000,A,8251.5039,N,01040.0065,E,0.00,,010111,0,,A*75+79161234567#

问题是python脚本中的sys.stdin没有收到行尾或文件末尾的字符,而sys.stdin.readline()则永远存在。我试图用另一个带有python脚本的电脑发送数据

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('', 57003))
s.sendall( u'hello'  )
data = s.recv(4024)
s.close()
print 'Received', data

如果消息是'hello',它会失败,但如果消息是'hello \ n',那就没关系,一切都很好。但我不知道告诉跟踪器或xinetd在消息末尾添加'\ n'。如何在没有EOF或EOL的情况下从sys.stdin中读取数据?

4 个答案:

答案 0 :(得分:7)

简单:

data=sys.stdin.read().splitlines()

for i in data:
        print i

没有新行

答案 1 :(得分:4)

sys.stdin.readline()一直等到收到换行符。然后它会认为当前行已完成并将其全部返回。如果要读取不包含换行符的数据,或者在处理(某些)数据之前不想等到收到换行符,那么您将不得不使用除{{1 }}。最有可能的是你应该调用readline,它会读取任意数据,直到达到给定的大小。

但是,您的GPS似乎以众所周知的NEMA格式发送数据,并且该格式肯定会以换行符终止每一行。实际上,它可能会使用CRLF(read)终止每一行,但\r\n可能会在到达TCP套接字之前被某个地方传送。无论哪种方式,每行的顶端都有一个'\ n`。

如果你的\r电话挂断而没有返回任何线路,很可能是因为发送方正在缓冲线路,直到它有一个完整的缓冲区。如果你等了足够长的时间让发送者的缓冲区填满,你就会立刻得到一大堆。如果发生了这种情况,您必须将发送方更改为在每次NEMA判决后刷新其发送缓冲区。

答案 2 :(得分:1)

您似乎正在接收#而不是<CR><LF>,只需阅读#符号即可。

data = ""
while len(data) == 0 or string[-1] <> '#':
    data += sys.stdin.read(1)

#do something with data
print 'ok'

答案 3 :(得分:0)

我的解决方案:

var = sys.stdin.readline().replace('\n', '')

它:

  • 在条目中找到换行符,
  • 将其从条目中替换为“(无)〜删除,
  • 将其分配给变量。