2017-02-15 3 views
0

Я наследую ReconnectingClientFactory и использую SSL-соединение. У нас все работает, но через несколько минут я получаю следующую ошибку. После того, как случилось это ошибка, то соединение потеряноTwisted: Mixing ReconnectingClientFactory с SSL write() Повысить частоту ssl часто

Unhandled Error 
Traceback (most recent call last): 
    File "/usr/local/hikvision/ezops/python/lib/python2.7/site-packages/twisted/python/log.py", line 103, in callWithLogger 
    return callWithContext({"system": lp}, func, *args, **kw) 
    File "/usr/local/hikvision/ezops/python/lib/python2.7/site-packages/twisted/python/log.py", line 86, in callWithContext 
    return context.call({ILogContext: newCtx}, func, *args, **kw) 
    File "/usr/local/hikvision/ezops/python/lib/python2.7/site-packages/twisted/python/context.py", line 118, in callWithContext 
    return self.currentContext().callWithContext(ctx, func, *args, **kw) 
    File "/usr/local/hikvision/ezops/python/lib/python2.7/site-packages/twisted/python/context.py", line 81, in callWithContext 
    return func(*args,**kw) 
--- <exception caught here> --- 
    File "/usr/local/hikvision/ezops/python/lib/python2.7/site-packages/twisted/internet/posixbase.py", line 597, in _doReadOrWrite 
    why = selectable.doRead() 
    File "/usr/local/hikvision/ezops/python/lib/python2.7/site-packages/twisted/internet/tcp.py", line 208, in doRead 
    return self._dataReceived(data) 
    File "/usr/local/hikvision/ezops/python/lib/python2.7/site-packages/twisted/internet/tcp.py", line 214, in _dataReceived 
    rval = self.protocol.dataReceived(data) 
    File "/usr/local/hikvision/ezops/python/lib/python2.7/site-packages/twisted/protocols/tls.py", line 430, in dataReceived 
    self._flushReceiveBIO() 
    File "/usr/local/hikvision/ezops/python/lib/python2.7/site-packages/twisted/protocols/tls.py", line 400, in _flushReceiveBIO 
    self._flushSendBIO() 
    File "/usr/local/hikvision/ezops/python/lib/python2.7/site-packages/twisted/protocols/tls.py", line 352, in _flushSendBIO 
    bytes = self._tlsConnection.bio_read(2 ** 15) 
    File "/usr/local/hikvision/ezops/python/lib/python2.7/site-packages/OpenSSL/SSL.py", line 1384, in bio_read 
    self._handle_bio_errors(self._from_ssl, result) 
    File "/usr/local/hikvision/ezops/python/lib/python2.7/site-packages/OpenSSL/SSL.py", line 1365, in _handle_bio_errors 
    _raise_current_error() 
    File "/usr/local/hikvision/ezops/python/lib/python2.7/site-packages/OpenSSL/_util.py", line 48, in exception_from_error_queue 
    raise exception_type(errors) 
OpenSSL.SSL.Error: [] 

мой код клиента, как это:

reactor.connectSSL(opscenter_addr, int(opscenter_port), NoahAgentFactory(), ssl.ClientContextFactory()) 

класс NoahAgentFactory так:

import logging 
import traceback 

from OpenSSL import SSL 
from twisted.internet import reactor,ssl 
from twisted.internet import task 
from twisted.internet.protocol import Protocol 
from twisted.internet.protocol import ReconnectingClientFactory 
import DataPackageCodecFactory as Codec 
from Header import MessageHandlerMap 
from Handler import HBReq, DefaultRspHandler 
from Util import Connection 

logger = logging.getLogger('opsagent') 


class NoahAgentProtocol(Protocol): 
    t = None 
    def connectionMade(self): 
     ''' 
      客户端连接成功之后会自动调用该方法 
      :return: 
     ''' 
     self.transport.setTcpKeepAlive(True) # maintain the TCP connection 
     self.transport.setTcpNoDelay(True) # allow Nagle algorithm 

     # 连接成功后保存连接信息 
     Connection.AgentTcpConnection = self 
     global t 
     logger.info('is already connect to the server') 
     self.recv_data_buffer = '' 
     # 创建定时的心跳任务,每隔30秒执行一次 
     t = task.LoopingCall(HBReq.execute, *[self]) 
     t.start(30) 

    def dataReceived(self, data): 
     logger.debug("Received Message: %s", repr(data)) 
     ###code handler packages########## 

    def connectionLost(self, reason): 
     ''' 
     当客户端连接断开的时候,会自动调用该方法 
     :param reason: 
     :return: 
     ''' 
     try: 
      t.stop() 
      # 清空全局链接信息 
      Connection.AgentTcpConnection = None 
     except: 
      logger.error(traceback.format_exc()) 
     logger.info('Connection is lost and Task stopped,Resaon =>%s', reason) 


class NoahAgentFactory(ReconnectingClientFactory): 
    def startedConnecting(self, connector): 
     logger.info('Started to connect.') 

    def buildProtocol(self, addr): 
     logger.info('Connected.') 
     logger.info('Resetting reconnection delay') 
     self.resetDelay() 
     return NoahAgentProtocol() 

    def clientConnectionLost(self, connector, reason): 
     logger.info('Lost connection. Reason:%s', reason) 
     self.resetDelay() 
     self.retry(connector) 
     # ReconnectingClientFactory.clientConnectionLost(self, connector, reason) 

    def clientConnectionFailed(self, connector, reason): 
     logger.info('Connection failed. Reason:%s', reason) 
     self.resetDelay() 
     self.retry(connector) 
+0

Похоже, что это может быть ошибка в поддержке TLS от Twisted. Было бы замечательно: версия Python, версия Twisted, версия OpenSSL, версия криптографии, версия pyOpenSSL и то, что работает на другой стороне этого соединения (общедоступный TLS-сервер, другой сервер, который вы написали, какую реализацию TLS он использует и т. д.). Было бы также очень приятно иметь минимальный пример, который воспроизводит проблему. http://sscce.org/ –

ответ

0

Я думаю, что это не ошибка в Twisted-х TLS, кроме ошибки, я посылаю сообщение не в основной реакторной нити, как мы знаем, скрученный режим с одним потоком, поэтому нет необходимости рассматривать проблемы безопасности потоков. Но я использую реактор.callInThread для длительной работы e cost bussiness и отправить сообщение напрямую, а write() не является безопасностью потоков, поэтому вызывайте эту ошибку, как только я использую jet.callFromThread при отправке сообщения, он работает правильно.

Смежные вопросы