使用mqtt客户端的服务器中的扭曲错误

时间:2014-03-27 05:56:05

标签: twisted

我正在运行Twisted TCP服务器。每个协议实例都有一个mqtt pub / sub客户端。我已将实际生产代码减少到下面最简单的形式。我已经删除了许多不相关的复杂性来简化错误查找过程。服务器适用于多个客户端连接并生成从mqtt客户端接收的数据,但在任何客户端连接/断开/重新连接几次后,我得到一个我无法理解或陷阱的异常。我希望Jean-Paul或其他人可以指出我的错误。

一旦发生异常,没有新客户端可以连接到服务器。每次新的连接尝试都会产生异常。

已连接的客户端继续接收数据。

例外是

Unhandled Error
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/twisted/python/log.py", line 73, in callWithContext
    return context.call({ILogContext: newCtx}, func, *args, **kw)
  File "/usr/lib/python2.7/dist-packages/twisted/python/context.py", line 118, in callWithContext
    return self.currentContext().callWithContext(ctx, func, *args, **kw)
  File "/usr/lib/python2.7/dist-packages/twisted/python/context.py", line 81, in callWithContext
    return func(*args,**kw)
  File "/usr/lib/python2.7/dist-packages/twisted/internet/posixbase.py", line 614, in _doReadOrWrite
    why = selectable.doRead()
--- <exception caught here> ---
  File "/usr/lib/python2.7/dist-packages/twisted/internet/tcp.py", line 1069, in doRead
    transport = self.transport(skt, protocol, addr, self, s, self.reactor)
  File "/usr/lib/python2.7/dist-packages/twisted/internet/tcp.py", line 786, in __init__
    self.startReading()
  File "/usr/lib/python2.7/dist-packages/twisted/internet/abstract.py", line 429, in startReading
    self.reactor.addReader(self)
  File "/usr/lib/python2.7/dist-packages/twisted/internet/epollreactor.py", line 256, in addReader
    _epoll.EPOLLIN, _epoll.EPOLLOUT)
  File "/usr/lib/python2.7/dist-packages/twisted/internet/epollreactor.py", line 240, in _add
    self._poller.modify(fd, flags)
exceptions.IOError: [Errno 2] No such file or directory

基本服务器代码是: (此示例将运行并生成异常)

from twisted.internet import reactor
from twisted.internet.protocol import Factory
from twisted.protocols import basic
from paho.mqtt import client  # The most recent version of the legacy Mosquitto client
from random import randint

class MsgReceiver(basic.LineReceiver):
    def __init__(self, factory):        # new (factory)
        self.factory = factory          # new (factory)

    def connectionMade(self):
        self.mqClient = self.startMQ()
        if self.mqClient:
            self.factory.clients.append(self)
        else:
            self.transport.loseConnection()

    def connectionLost(self, reason):
        pass

    def lineReceived(self, line):
        pass

    def on_message(self, mosq, obj, msg):
        try:
            self.sendLine(msg.payload)
        except Exception, err:
            print(err.message)

    def startMQ(self):
        mqName = "-".join(["myAppName", str(randint(0, 99999))])
        mqClient = client.Client(mqName)

        if mqClient.connect("localhost", 1883, 60) != 0:
            print('Could not connect to mq server')
            return False

        mqClient.on_message = self.on_message

        (success, mid) = mqClient.subscribe("myTopic", 0)
        if success != 0:
            return False

        mqClient.loop_start()
        return mqClient

class MsgReceiverFactory(Factory):
    allow_reuse_address = True

    def __init__(self, clients):
        self.clients = clients

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


if __name__ == "__main__":
    try:
        clients = []
        reactor.listenTCP(43217, MsgReceiverFactory(clients))
        reactor.run()
    except Exception, err:
        print(err.message)
        if reactor.running:
            reactor.stop()

一个简单的客户端,它会在运行两次时出现错误(第一次运行正常): 有趣的是,如果我启用time.sleep(3)它运行良好并且似乎不会导致错误

#!/usr/bin/python
from __future__ import print_function
import socket
import time

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("localhost", 43217))
data = s.recv(1024)
print(data)
#time.sleep(3)
s.close()

0 个答案:

没有答案