【发布时间】:2012-08-31 17:49:11
【问题描述】:
我想从我的 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 读取数据?
【问题讨论】:
-
为什么需要使用
.readline()?.read()不会吗? -
我猜你需要
.read(),直到你遇到一个特定的信号,上面写着“break here”,这不一定是换行符,我猜最后可能是#,或者$开头。
标签: python tcp tcplistener xinetd