簡體   English   中英

連接異常終止后,通過套接字發布數據

[英]Publishing data via socket after connection is aborted

我有一個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是通常的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在斷開連接時暫停,或者繼續嘗試直到連接再次打開?

我建議閱讀有關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)

檢查是否可行?

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM