Пав*_*вин 4 python tcp tcplistener xinetd
我想从我的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
}
Run Code Online (Sandbox Code Playgroud)
在/ etc/services中配置
gps-gprs 57003/tcp # Tracking system
Run Code Online (Sandbox Code Playgroud)
和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()
Run Code Online (Sandbox Code Playgroud)
跟踪器以原始文本发送数据字符串
$GPRMC,132017.000,A,8251.5039,N,01040.0065,E,0.00,,010111,0,,A*75+79161234567#
Run Code Online (Sandbox Code Playgroud)
问题是python脚本中的sys.stdin不接收行尾或文件结束字符,sys.stdin.readline()永远不会.我试图用python脚本从另一台PC发送数据
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
Run Code Online (Sandbox Code Playgroud)
如果消息是'hello',它会失败,但是如果消息是'hello \n',那就没关系,一切都很好.但我不知道告诉跟踪器或xinetd在消息末尾添加'\n'.如何在没有EOF或EOL的情况下从sys.stdin中读取数据?
简单:
data=sys.stdin.read().splitlines()
for i in data:
print i
Run Code Online (Sandbox Code Playgroud)
没有换行
sys.stdin.readline()永远等待,直到收到换行符。然后,它认为当前行已完成并完整返回。如果您想读取不包含换行符的数据,或者不希望等到收到换行符后再处理(某些)数据,那么您将不得不使用以外的其他内容readline。您很可能应该调用read,它会读取给定大小的任意数据。
但是,您的GPS似乎正在以众所周知的NEMA格式发送数据,并且该格式肯定以换行符结束了每一行。实际上,它可能以CRLF(\r\n)终止每一行,但是有可能在\r将其插入TCP套接字之前被割断了。无论哪种方式,每行的结尾处都有一个'\ n'。
如果您的readline呼叫挂起而没有返回任何线路,则很可能是因为发送方正在缓冲线路,直到它具有完整的缓冲区为止。如果您等待足够长的时间以使发送者的缓冲区填满,那么您将一次获得一整行。如果发生了这种情况,则必须将发送方更改为在每个NEMA语句之后刷新发送缓冲区。
| 归档时间: |
|
| 查看次数: |
16283 次 |
| 最近记录: |