连接中止后通过套接字发布数据
Publishing data via socket after connection is aborted
我有一个 Python (2.7) 脚本,它从文件中读取实时数据并将其发布(通过网络)到另一台计算机上的服务器。特别是,此服务器是 graphite.
的 Carbon
服务器部分
相关部分代码如下:
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] An established connection was aborted by the software in your host machine
当我重新启动主机(COMPUTER-NAME
)时,我必须重新启动Python脚本才能再次发送数据。
有什么方法可以让 socket
在发现断开连接时暂停,或者继续尝试直到连接再次打开?
我建议阅读有关 socket.timeout("seconds to sleep") 的内容,这会让您了解如何使用它。在您的情况下,在建立套接字连接之前立即使用 socket.settimeout(),并在 socket.connection() 之后立即使用 socket.settimeout(None)。
这样,您可以延迟建立连接。但是如果超时值超过 system/server 停机时间,那么脚本最终会出现同样的超时错误。
connect_timeout = 100 #in seconds
socket.settimeout(connect_timeout)
socket.connect()
socket.settimeout(None)
检查是否有效?
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()
我有一个 Python (2.7) 脚本,它从文件中读取实时数据并将其发布(通过网络)到另一台计算机上的服务器。特别是,此服务器是 graphite.
的Carbon
服务器部分
相关部分代码如下:
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] An established connection was aborted by the software in your host machine
当我重新启动主机(COMPUTER-NAME
)时,我必须重新启动Python脚本才能再次发送数据。
有什么方法可以让 socket
在发现断开连接时暂停,或者继续尝试直到连接再次打开?
我建议阅读有关 socket.timeout("seconds to sleep") 的内容,这会让您了解如何使用它。在您的情况下,在建立套接字连接之前立即使用 socket.settimeout(),并在 socket.connection() 之后立即使用 socket.settimeout(None)。 这样,您可以延迟建立连接。但是如果超时值超过 system/server 停机时间,那么脚本最终会出现同样的超时错误。
connect_timeout = 100 #in seconds
socket.settimeout(connect_timeout)
socket.connect()
socket.settimeout(None)
检查是否有效?
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()