【问题标题】:Publishing data via socket after connection is aborted连接中止后通过套接字发布数据
【发布时间】:2018-02-01 11:39:57
【问题描述】:

我有一个 Python (2.7) 脚本,它从文件中读取实时数据并将其(通过网络)发布到另一台计算机上的服务器。特别是,此服务器是graphiteCarbon 服务器部分。

相关部分代码如下:

import socket

CARBON_HOST = 'COMPUTER-NAME'
CARBON-PORT = 2003
CARBON_PATH = 'folder.name.meaurement'

s = socket.socket()
s.connect((CARBON_HOST, CARBON_PORT))

while True:
 if s:
  s.send('%s %s %s\n'%(CARBON_PATH, str(data), int(time.time())))
    time.sleep(WAIT)

data 是从我的文件中导入的最新条目,time 是通常的条目。

当我关闭Carbon 服务器所在的计算机COMPUTER-NAME 时,出现此错误:

s.send('%s %s %s\n'%(CARBON_PATH, str(data), int(time.time())))
socket.error: [Errno 10053] 已建立的连接被主机中的软件中止

当我重新启动主机 (COMPUTER-NAME) 时,我必须重新启动 Python 脚本才能再次发送数据。

有什么方法可以告诉socket 在发现它已断开连接时暂停,或者继续尝试直到连接再次打开?

【问题讨论】:

    标签: python sockets graphite-carbon


    【解决方案1】:

    在出现socket.error 异常后,您不能使用同一个套接字,连接已断开。但是,您可以捕获异常、创建新连接并使用它来发送数据。

    关于您的最后一个问题,您可以告诉您的程序继续尝试,直到使用 while 循环发送数据。一个基本的例子,

    import socket
    import time
    
    CARBON_HOST = 'COMPUTER-NAME'
    CARBON_PORT = 2003
    CARBON_PATH = 'folder.name.meaurement'
    WAIT = 10
    
    s = socket.socket()
    s.connect((CARBON_HOST, CARBON_PORT))
    data = 'my data'
    
    while True:
        packet = '%s %s %s'%(CARBON_PATH, str(data), int(time.time()))
        while True:
            try:
                s.send(packet)
                break
            except socket.error as e:
                print(e)
                s.close()
                s = socket.socket()
                s.connect_ex((CARBON_HOST, CARBON_PORT))
        time.sleep(WAIT)
    
    s.close()
    

    【讨论】:

      【解决方案2】:

      我建议阅读有关 socket.timeout("seconds to sleep") 的内容,它会让您了解如何使用它。在您的情况下,在建立套接字连接之前使用socket.settimeout(),并在socket.connection()之后不久使用socket.settimeout(None)。 这样,您可以延迟建立连接。但是如果超时值超过系统/服务器停机时间,那么脚本最终会出现同样的超时错误。

      connect_timeout = 100 #in seconds
      socket.settimeout(connect_timeout)
      socket.connect()
      socket.settimeout(None)
      

      检查是否有效?

      【讨论】:

        猜你喜欢
        • 2010-12-10
        • 1970-01-01
        • 1970-01-01
        • 2019-06-12
        • 1970-01-01
        • 2012-02-12
        • 1970-01-01
        • 2016-04-06
        • 1970-01-01
        相关资源
        最近更新 更多