我想从我的GPS跟踪器接收数据。它通过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'。如何从sys.stdin读取数据而不带有EOF或EOL?
.readline()
пјҹ.read()
дёҚиЎҢеҗ—пјҹ - Martijn Pieters.read()
直到遇到一个特定的信号,它说“在这里中断”,它不一定是换行符,可能是末尾的#
或开头的$
。 - jadkik94