gpt4 book ai didi

python - 带有 TCPServer 的 twind 应用程序 (.tac) 无法正常工作,而常规 Twisted .py 则可与 ListenTCP 一起使用

转载 作者:太空宇宙 更新时间:2023-11-03 18:10:13 27 4
gpt4 key购买 nike

我目前正在尝试将基于twisted的应用程序转换为twistd Twisted应用程序框架(TAC)。

如果我启动 .py,则该应用程序可以运行,但不能使用“twistd -noy zmq2tcp.tac”守护进程。ZMQ 连接似乎正确打开,但如果使用 tac 文件启动,它不会监听端口 2323。

请解释一下为什么在这种情况下listenTCP起作用但internet.TCPServer不起作用

zmq2tcp.tac 文件:

#!/usr/bin/python
# **- encoding: utf-8 -**
from twisted.application import internet, service
from twisted.application.service import Application

from txzmq import ZmqFactory, ZmqEndpoint, ZmqSubConnection, ZmqPushConnection

from zmq2tcp import *

LISTEN_PORT = 2323

class ListenService(service.Service):
def __init__(self):
self.zf = ZmqFactory()
self.minidoFactory = MinidoServerFactory()

def startService(self):
self.sube = ZmqEndpoint('connect', 'tcp://localhost:5557')
self.push = ZmqEndpoint('connect', 'tcp://localhost:5558')
self.subconn = ZmqSubConnection(self.zf, self.sube)
self.subconn.subscribe('')

# Create the resource
self.minidoFactory.pushconn = ZmqPushConnection(self.zf, self.push)
self.subconn.gotMessage = self.minidoFactory.send2tcp
return internet.TCPServer(LISTEN_PORT, self.minidoFactory)

def stopService(self):
del self.sube
del self.push
del self.subconn

application = Application('ZMQ2TCP')
service = ListenService()
service.setServiceParent(application)

zmq2tcp.py 文件:

#!/usr/bin/env python
# **- encoding: utf-8 -**
"""
Minido-Unleashed is a set of programs to control a home automation
system based on minido from AnB S.A.

Please check http://kenai.com/projects/minido-unleashed/

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.

***

This program connects to a STOMP server, and allow dual way communication
with the minido bus, checking the validity of the packet before sending.
"""

###############################################################################
from __future__ import print_function
from twisted.application import internet, service
from twisted.internet.protocol import Protocol, ReconnectingClientFactory
from twisted.internet.protocol import Factory


# Other imports
import datetime
import time
import sys
import msgpack

# minido
from protocol import *

# txZMQ
from txzmq import ZmqFactory, ZmqEndpoint, ZmqPubConnection, ZmqSubConnection, ZmqPushConnection

MINIDO_LISTEN_PORT = 2323

class MinidoServerFactory(Factory):
def __init__(self):
self.connections = []

def startedConnecting(self, connector):
print('Started to connect.')

def buildProtocol(self, addr):
return MinidoProtocol(self)

def clientConnectionLost(self, connector, reason):
print('Lost connection. Reason:', reason)
ReconnectingClientFactory.clientConnectionLost(self, connector, reason)

def clientConnectionFailed(self, connector, reason):
print('Connection failed. Reason:', reason)
ReconnectingClientFactory.clientConnectionFailed(self, connector,
reason)
def recv_message(self, message):
print(': TCP to STOMP : %s' % (' '.join(map(lambda i: '{0:02X}'.format(i),message))))
pushconn.push(msgpack.packb(message))

def send2tcp(self, rawmessage, tag):
message = msgpack.unpackb(rawmessage)
if type(message) is tuple:
print(": STOMP to %i TCP client(s) : %s" % (
len(self.connections),
' '.join(map(lambda i: '{0:02X}'.format(i),message))))
for conn in self.connections:
conn.send_data(message)

if __name__ == '__main__':
from twisted.internet import reactor
zf = ZmqFactory()
minidoFactory = MinidoServerFactory()
sube = ZmqEndpoint('connect', 'tcp://localhost:5557')
subconn = ZmqSubConnection(zf, sube)
subconn.subscribe('')

subconn.gotMessage = minidoFactory.send2tcp

push = ZmqEndpoint('connect', 'tcp://localhost:5558')
minidoFactory.pushconn = ZmqPushConnection(zf, push)
reactor.listenTCP(MINIDO_LISTEN_PORT, minidoFactory)
reactor.run()

最佳答案

问题是在你的 ListenService.startService 中您正在创建并返回一个TCPServer服务,但您没有启动该服务。

IService.startService 不返回值,因此而不是 return internet.TCPServer(LISTEN_PORT, self.minidoFactory) ,做internet.TCPServer(LISTEN_PORT, self.minidoFactory).startService() .

但这有一个明显的问题,那就是你的 stopService然后就会不记得TCPServer在哪里是稍后停止。最好将其分解为创建 TCPServer尽快,并与您的服务一起启动/停止它,如下所示:

class ListenService(service.Service):
def __init__(self):
self.zf = ZmqFactory()
self.minidoFactory = MinidoServerFactory()
self.tcpService = internet.TCPServer(LISTEN_PORT, self.minidoFactory)

def startService(self):
self.sube = ZmqEndpoint('connect', 'tcp://localhost:5557')
self.push = ZmqEndpoint('connect', 'tcp://localhost:5558')
self.subconn = ZmqSubConnection(self.zf, self.sube)
self.subconn.subscribe('')

# Create the resource
self.minidoFactory.pushconn = ZmqPushConnection(self.zf, self.push)
self.subconn.gotMessage = self.minidoFactory.send2tcp
self.tcpService.startService()

def stopService(self):
del self.sube
del self.push
del self.subconn
return self.tcpService.stopService()

关于python - 带有 TCPServer 的 twind 应用程序 (.tac) 无法正常工作,而常规 Twisted .py 则可与 ListenTCP 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26129899/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com