def put_data(line = '', dest_host = 'server', dest_port = '876'):
''' This method once invoked pushes data to dest_host and dest_port '''
if line:
cmd = '/bin/echo put ' + line + '| ' + '/bin/nc -w 15 server port'
print('TCP put using command: ' + cmd)
os.system(cmd)
我正在使用上面的方法來將TCP數據行放到HBASE頂部的opentsdb驅動程序上。python tcp put connection reset
這種方法可以看出,爲被推出的每一行數據調用netcat工具。
問題: 1.)有沒有更好的方式來完成這項任務,無需每次打開一個TCP連接,我想推送的每一行數據?我每分鐘都會運行一次,這導致了大量TIME_WAIT狀態的連接。
2.)我可以用一個持久的TCP套接字每次推1000條線嗎?我已經查看了python中的netcat實現,但是當我推送所有行時,它們似乎會導致連接重置
例如: 當我嘗試使用下面的方法時,我不斷收到錯誤:error (104「由對等連接復位」)數據的
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(server, port)
for line in data_list:
s.sendall(line)
s.close()
error(104, 'Connection reset by peer')
採樣線被推:
line1 = 'fin.wait2 1385428269 0.0 host=srv1 testname=tcp source=nag03 product=rebuild'
line2 = 'established 1385428269 11.0 host=srv2 testname=tcp source=nag03 product=rebuild'
line3 = 'fin.wait1 1385428269 0.0 host=srv3 testname=tcp source=nag03 product=rebuild'
line4 = 'last.ack 1385428269 0.0 host=srv4 testname=tcp source=nag03 product=rebuild'
line5 = 'unknown 1385428269 0.0 host=srv5 testname=tcp source=nag03 product=rebuild'
line6 = 'syn.recv 1385428269 0.0 host=srv6 testname=tcp source=nag03 product=rebuild'
是的每條線都在他們的新線上開始。所以第二種方法適用於多達20行,然後我從opentsdb驅動程序獲得連接重置。 –
好的,請(a)向我們展示一些示例數據,這樣人們就不必猜測它的樣子,並且(b)更新答案以解釋它在失敗之前可以使用20行左右,因爲正如它所寫的那樣意味着它根本不起作用。 – abarnert
同時,如果OpenTSDB出於某種原因不喜歡在一行中獲取大量單獨的命令,那麼將它們連接在一起併發送一個大批量文件又如何呢?換句話說,當你的循環在20之後失敗時,'s.sendall('。join(data_list))'是否能夠工作100條? – abarnert