连接中止后通过套接字发布数据

时间:2018-02-01 11:39:57

标签: python sockets graphite-carbon

我有一个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是通常的。

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

  

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

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

如果socket看到它已断开连接,或者在连接再次打开之前继续尝试,是否可以告诉 div.nav { background-color: black; color: white; font-size: 20px; font-weight: bold; position: fixed; width: 100%; text-align: center; } ul { } li { display: inline-block; list-style: none; } li a { padding: 15px; color: white; } <div class="nav"> <ul> <li><a href="index.html">Home</a></li> <li><a href="watisdb.html">Wat is D&B</a></li> <li><a href="dbnederland.html">D&B in Nederland</a></li> </ul> </div> 暂停?

2 个答案:

答案 0 :(得分:1)

我建议阅读有关socket.timeout(&#34;睡眠秒数&#34;)的内容,它会让您知道如何使用它。在你的情况下,在建立套接字连接之前使用socket.settimeout(),在socket.connection()之后不久使用socket.settimeout(None)。 这样,您就可以延迟建立连接。但是如果超时值超出系统/服务器停机时间,那么脚本最终会出现相同的超时错误。

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

检查是否有效?

答案 1 :(得分: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()