2017-12-29 42 views
3

연결되어 있는지 확인하려면 어떻게해야 자기 설명이다 다음 코드 :파이썬 - 소켓이 여전히

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect(host, port) 
s.send("some data") 
# don't close socket just yet... 
# do some other stuff with the data (normal string operations) 
if s.stillconnected() is true: 
    s.send("some more data") 
if s.stillconnected() is false: 
    # recreate the socket and reconnect 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.connect(host, port) 
    s.send("some more data") 
s.close() 

내가 s.stillconnected() 내가 맹목적으로 소켓을 다시하지 않으 구현하려면 어떻게합니까.

+0

좋은 직장 +1하지만 여기에서 귀하의 현상금에 대한 의견을 참조하십시오 : https://superuser.com/questions/955266/prevent-windows-7-sleep-while-files-are-being-accessed-by-network 및 let 그 의견에 도움이 될만한 것이 있다면 나도 알아. –

답변

3

서버 연결이 더 이상 작동하지 않으면 send 메서드를 호출하면 예외가 발생하므로 try-exception 블록을 사용하여 데이터를 보내고 throw 된 예외를 catch 한 다음 연결을 다시 설정할 수 있습니다.

try: 
    s.send("some more data") 
except: 
    # recreate the socket and reconnect 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.connect(host, port) 
    s.send("some more data") 

편집 : @ 당으로 장 폴 Calderone의 의견, 낮은 인 대신 send의 모든 데이터를 보내거나 오류가 발생합니다 높은 수준의 방법입니다 sendall 방법을 사용하여 고려하시기 바랍니다 모든 데이터의 전송을 보장하지 않는 최상위 레벨 메소드, 또는 핸들 할 수있는 HTTP 라이브러리와 같은 상위 레벨 모듈 사용 e 소켓 수명주기.

+1

네, 고맙습니다! –

+0

try/except 블록을 사용하지 않고보다 효율적인 방법으로 stillConnected() 함수를 구현할 수 있습니까? ; 만약 그렇다면 당신의 대답에 그것을 더해주세요. –

+0

다행이었습니다. 지금이 순간이 제가 생각할 수있는 최선의 방법입니다. 데이터를받는 경우 연결이 종료 될 때 빈 문자열이 수신 될 때까지 데이터 수신을 유지하는 while 루프를 시도 할 수도 있습니다. –