Python中最简单的“白天”服务客户端?
用Python写一个白天客户端最简单的方法是什么?
如果有更多未知大小但仍然是纯文本的数据,我该如何读取直到服务器关闭连接呢?
3 个回答
0
使用Twisted吧——虽然理解这个概念可能需要一些时间,但它真的很棒!
可以从这些教程开始学习,链接在这里:http://twistedmatrix.com/documents/current/core/howto/index.html——前两个教程就足够你入门了。
1
#!/usr/bin/env python
import socket
from contextlib import closing as C
address = "time.nist.gov", socket.getservbyname('daytime')
with C(socket.create_connection(address, timeout=2)) as conn:
with C(conn.makefile()) as f:
print f.read(),
解决方案:
- 能够干净地结束资源使用
- 如果服务出现问题,可能会占用你的内存;不过rfc 867提到:
白天时间应该只是一行。
这里有一个twisted
的版本:
#!/usr/bin/env python
import sys
from twisted.internet import protocol, reactor
class EchoClientFactory(protocol.ClientFactory):
protocol = lambda _: protocol.ConsumerToProtocolAdapter(sys.stdout)
def clientConnectionLost(self, connector, reason):
reactor.stop()
def clientConnectionFailed(self, connector, reason):
print reason.value
reactor.stop()
host, port = "time.nist.gov", 13
reactor.connectTCP(host, port, EchoClientFactory(), timeout=2)
reactor.run()
4
这个可以用:
#!/usr/bin/python
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = "time.nist.gov"
port = 13
s.connect((host,port))
while True:
data = s.recv(10000)
if data:
print data
else:
break
s.close()