我正在编写一个包含服务器(使用Twisted)和客户端(没有Twisted)的Python程序
服务器部分使用Twisted和Twisted' application framework实现,并使用Twistd启动以进行守护。
在不同服务器上运行的客户端是一个简单的Python脚本,没有任何Twisted内容(并且没有特定于应用程序框架的东西)。它也应该作为守护进程运行。仅供参考,这是来源:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket
import sys
import time
import syslog
SERVER_IP = '127.0.0.1'
SERVER_PORT = 43278
BEAT_PERIOD = 1
class HeartbeatClient:
'''
A Client sending heartbeats to a monitoring server.
'''
def __init__(self, server_ip, port, beat_period):
syslog.syslog( ('Sending heartbeat to IP %s , port %d' +
'\n press Ctrl-C to stop\n')
% (SERVER_IP, SERVER_PORT))
def run(self):
while True:
hbSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
hbSocket.sendto('PyHB', (SERVER_IP, SERVER_PORT))
if __debug__:
print 'Time: %s' % time.ctime()
time.sleep(BEAT_PERIOD)
if __name__ == '__main__':
hbc = HeartbeatClient()
hbc.run()
现在我想知道我是否也可以使用Twistd守护客户端?因此,我会在客户端之外创建一个Twisted-Application。但是我看到的所有关于Twisted应用程序的例子都实现了一些Twisted网络服务器的东西(比如我的情况下是internet.UDPServer ......),我的客户不使用它。
因此可以使用Twistd将我的客户端作为守护进程启动,我必须做出哪些更改?我应该重写客户端以充分利用Twisted吗?如果是,那么有没有类似的例子如何编写基于Twisted的网络客户端?
或者我是否必须为客户端使用不同的daemonize库?有一个good library for that,但我试图保持一致,并为客户端和服务器使用相同的守护进程机制。
答案 0 :(得分:4)
使用Twisted,作为tac文件,您的HeartbeatClient
看起来像这样:
from twisted.application.service import Application, Service
from twisted.internet import reactor
from twisted.internet.task import LoopingCall
from twisted.internet.protocol import DatagramProtocol
class HeartbeatClient(Service):
def startService(self):
self._call = LoopingCall(self._heartbeat)
self._call.start(BEAT_PERIOD)
def stopService(self):
self._call.stop()
def _heartbeat(self):
port = reactor.listenUDP(0, DatagramProtocol())
port.write('PyHB', (SERVER_IP, SERVER_PORT))
port.stopListening()
application = Application("PyHB")
HeartbeatClient().setServiceParent(application)
请注意使用reactor.listenUDP
,即使您只发送UDP数据报,但未接收任何数据报。 UDP实际上没有客户端和服务器的概念,它只有开放端口。所有UDP端口都可以发送和接收数据报。这就是为什么只有reactor.listenUDP
,而不是reactor.connectUDP
。
除此之外,LoopingCall
为您提供所需的循环,并将代码放入自定义Service
子类中,让您在适当的时间启动和停止循环。