1

サーバー (Twisted を使用) とクライアント (Twisted なし) で構成される Python プログラムを作成しています。

サーバー部分は Twisted と Twisted のアプリケーション フレームワークを使用して実装され、Twistd で起動されてデーモン化されます。

別のサーバーで実行されるクライアントは、Twisted のものを一切含まない (そしてアプリケーション フレームワーク固有のものを含まない) 単純な Python スクリプトです。また、デーモンとして実行する必要があります。参考までに、これはソースです:

#!/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 インターネットサーバーのもの (私の場合は internet.UDPServer...) を実装する Twisted アプリケーションに関するものです。

Twistd を使用してクライアントをデーモンとして起動することは可能ですか? また、どのような変更を加える必要がありますか? Twisted をフルに活用するには、クライアントを書き直す必要がありますか? はいの場合、Twisted ベースのネットワーク クライアントを作成する方法と同様の例はありますか?

または、クライアントに別のデーモン化ライブラリを使用する必要がありますか? そのための優れたライブラリがありますが、一貫性を保ち、クライアントとサーバーに同じデーモン化メカニズムを使用しようとしています。

4

1 に答える 1

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.listenUDPUDP データグラムを送信しているだけで、何も受信していない場合でも、 の使用に注意してください。UDP には、実際にはクライアントとサーバーの概念がなく、開いているポートしかありません。すべての UDP ポートは、データグラムを送受信できます。そのため、 だけがありreactor.listenUDP、 はありませんreactor.connectUDP

それとは別に、LoopingCall必要なループを提供し、コードをカスタムServiceサブクラスに配置すると、適切なタイミングでループを開始および停止できます。

于 2011-09-09T13:28:13.790 に答える