Python中最简单的“白天”服务客户端?

1 投票
3 回答
2743 浏览
提问于 2025-04-15 16:49

用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()

撰写回答