我有一个Python (2.7)脚本,它从文件中读取实时数据并(通过网络)发布到另一台计算机上的服务器上。特别是这台服务器是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是通常的。
当我关闭COMPUTER-NAME服务器所在的计算机Carbon时,会出现以下错误:
s.send('%s %s‘n’%(CARBON_PATH,str(data),int(time.time() socket.error: Errno 10053已建立的连接被主机中的软件中止
当我重新启动主机(COMPUTER-NAME)时,我必须重新启动Python,以便再次发送数据。
有什么方法可以让socket在看到断开连接时暂停,或者继续尝试直到连接再次打开?
发布于 2018-02-01 22:57:05
不能在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()发布于 2018-02-01 12:10:48
我建议阅读socket.timeout(“秒到睡眠”),这将给您使用它的想法。在您的示例中,在进行套接字连接之前使用socket.settimeout(),在socket.connection()之后使用socket.settimeout(None)。这样,您就可以延迟建立连接。但是,如果超时值超出了系统/服务器的停机时间,那么脚本最终会出现相同的超时错误。
connect_timeout = 100 #in seconds
socket.settimeout(connect_timeout)
socket.connect()
socket.settimeout(None)检查一下是否有效?
https://stackoverflow.com/questions/48561871
复制相似问题