# -*- coding: utf-8 -*-
import socket
import time
try:
SERVER_IP = "123.212.125.132"
SERVER_PORT = 6811
server_addr = (SERVER_IP, SERVER_PORT)
socket_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket_tcp.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
while True:
try:
print("Connecting to server @ %s:%d..." % (SERVER_IP, SERVER_PORT))
socket_tcp.connect(server_addr)
break
except socket.error:
print("Can't connect to server,try it latter!")
time.sleep(1)
continue
print("Receiving package...") # socket 連接成功,等待接收資訊
while True:
try:
number = socket_tcp.send(“hello world")
print number
time.sleep(5)
except socket.error:
print ("socket error")
except:
print ("other error")
except:
pass
大家看一看上面的代碼,我的代碼主要是作為socket的客戶端,鏈接遠程服務器,每隔5秒鐘向遠程服務器發送一次“hello world”,在發送的程序中,如果出現socket鏈接錯誤,就在螢屏上輸出“socket error”。
現在的情況是這樣,我在臺式電腦上使用python除錯器PyCharm來運行程式,正常鏈接socket以后,假設出先網路錯誤,比如拔掉網線或者沒有網路了,這時候按道理來說socket應該是斷開連接的,假如我拔掉網線經過大約30秒后,PyCharm才輸出“socket error”。
基于在電腦端的情況,我把相同的程式拷貝到“”樹莓派“”(樹莓派系統是自帶的raspbian)上運行,相同情況下,比如拔掉網線,要經過20多分鐘才能輸出“socket error”。
我現在想就是想在socket連接出現錯誤的時候,比如拔掉網線、網路錯誤等導致的socket連接錯誤,能夠迅速的檢測到socket連接錯誤,然后進行socket連接,現在最大的問題就是不知道如何監測socket的鏈接狀態,求各位大佬指教!~
uj5u.com熱心網友回復:
我也碰到過這個問題,沒有深究,直接改成短連接了uj5u.com熱心網友回復:
用settimeout(5)如果5秒沒反應,獲取拋出例外,提示。
uj5u.com熱心網友回復:
我只是增加了一行代碼socket_tcp.settimeout(5),我剛才嘗試了一下,也是不行的,就是正常鏈接以后,拔掉網線還是跟以前一樣的情況。
uj5u.com熱心網友回復:
我覺得可以適當深入研究一下,因為socket用的還是蠻廣泛的
uj5u.com熱心網友回復:
過了5秒程式沒有拋出例外?
uj5u.com熱心網友回復:
用settimeout(5)
如果5秒沒反應,獲取拋出例外,提示。
我只是增加了一行代碼socket_tcp.settimeout(5),我剛才嘗試了一下,也是不行的,就是正常鏈接以后,拔掉網線還是跟以前一樣的情況。
過了5秒程式沒有拋出例外?
沒有拋出例外,過了大概30秒才拋出例外的
uj5u.com熱心網友回復:
sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sk.settimeout(3)
try:
sk.connect(('10.202.1.1', 1521))
print 'Server port 1521 OK!'
except Exception:
print 'Server port 1521 not connect!'
return ""
sk.close()
我在連接ORACLE前判斷服務器是否開啟,基本都是3秒左右回傳服務器狀態的。
uj5u.com熱心網友回復:
sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sk.settimeout(3)
try:
sk.connect(('10.202.1.1', 1521))
print 'Server port 1521 OK!'
except Exception:
print 'Server port 1521 not connect!'
return ""
sk.close()
我在連接ORACLE前判斷服務器是否開啟,基本都是3秒左右回傳服務器狀態的。
你的思路應該是這樣:就是判斷socket的鏈接狀態是運用sk.connent()來判斷的,這樣的話,假設我要每隔1分鐘檢查一下socket狀態就要sk.connet一下,這樣的方法是不是不好?
uj5u.com熱心網友回復:
我這邊的需求就是有的時候因為網路或者資料庫服務器的問題, ORACLE連接不上, 會花近1分鐘才有結果,所以用這個socket來先判斷服務器狀態。只是解決問題方法, 好不好我也說不上。
uj5u.com熱心網友回復:
另外, 我看看到有檔案提到 KEEPALIVE 方式,超時時間會很長,可能是這個影響了例外回傳時間。 建議你試試1樓說的短連接。uj5u.com熱心網友回復:
我也遇到這個問題了, Win7和Win10下都是一樣的, 如果是直接插在本機上的網線拔掉, timeout例外會拋出, 如果經過路由器, 就要等差不多30秒才有回應.轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/54187.html
上一篇:為什么python打包you-get后運行exe you-get會出錯
下一篇:python語法求助
