6

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

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',没关系,一切都很好。但我不知道如何告诉 tracker 或 xinetd 在消息末尾添加这个 '\n'。如何在没有 EOF 或 EOL 的情况下从 sys.stdin 读取数据?

4

4 回答 4

8

简单的:

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

for i in data:
        print i

没有换行符

于 2015-06-17T19:33:40.740 回答
7

sys.stdin.readline()永远等待,直到它收到换行符。然后它认为当前行是完整的并完整地返回它。如果您想读取不包含换行符的数据,或者您不想等到收到换行符后再处理(部分)数据,那么您将不得不使用readline. 最有可能你应该调用read,它读取任意数据到给定大小。

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

如果您的readline呼叫挂起而没有返回任何线路,很可能是因为发送方正在缓冲线路,直到它有一个完整的缓冲区。如果您等待发件人缓冲区填满的时间足够长,您将一次收到一大堆行。如果发生这种情况,您必须将发送者更改为在每个 NEMA 语句之后刷新其发送缓冲区。

于 2012-09-06T20:50:51.570 回答
2

看来您正在接收#而不是<CR><LF>,请阅读直到#标志。

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

#do something with data
print 'ok'
于 2012-09-06T21:50:47.907 回答
1

我的解决方案:

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

它 :

  • 在条目中找到换行符,
  • 将其从条目中替换为 '' (none) ~remove,
  • 将其分配给变量。
于 2020-01-21T11:12:31.363 回答