0

我有一个 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 %s\n'%(CARBON_PATH, str(data), int(time.time())))
socket.error: [Errno 10053] 已建立的连接被软件中止你的主机

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

有没有办法让我socket看到它已断开连接时暂停,或者继续尝试直到连接再次打开?

4

2 回答 2

1

我建议阅读有关 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)

检查这是否有效?

于 2018-02-01T12:10:48.407 回答
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()
于 2018-02-01T22:57:05.387 回答