树莓派、python的socket断线重连的问题

一个不会编程的小白菜 2018-01-09 02:12:28
# -*- 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的链接状态,求各位大佬指教!~
...全文
1402 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
pentiumCM 2021-06-27
  • 打赏
  • 举报
回复

很简单,client给server主动发送数据,发送失败的话进行重连操作

Nore 2020-04-26
  • 打赏
  • 举报
回复
我也遇到这个问题了, Win7和Win10下都是一样的, 如果是直接插在本机上的网线拔掉, timeout异常会抛出, 如果经过路由器, 就要等差不多30秒才有响应.
陈年椰子 2018-01-11
  • 打赏
  • 举报
回复
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秒左右返回服务器状态的。
陈年椰子 2018-01-11
  • 打赏
  • 举报
回复
另外, 我看看到有文档提到 KEEPALIVE 方式,超时时间会很长,可能是这个影响了异常返回时间。 建议你试试1楼说的短连接。
陈年椰子 2018-01-11
  • 打赏
  • 举报
回复
我这边的需求就是有的时候因为网络或者数据库服务器的问题, ORACLE连接不上, 会花近1分钟才有结果,所以用这个socket来先判断服务器状态。 只是解决问题方法, 好不好我也说不上。
  • 打赏
  • 举报
回复
引用 7 楼 seakingx 的回复:
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一下,这样的方法是不是不好?
  • 打赏
  • 举报
回复
引用 5 楼 seakingx 的回复:
[quote=引用 3 楼 qq_20656883 的回复:] [quote=引用 2 楼 seakingx 的回复:] 用settimeout(5) 如果5秒没反应,获取抛出异常,提示。
我只是增加了一行代码socket_tcp.settimeout(5),我刚才尝试了一下,也是不行的,就是正常链接以后,拔掉网线还是跟以前一样的情况。 [/quote] 过了5秒程序没有抛出异常?[/quote] 没有抛出异常,过了大概30秒才抛出异常的
陈年椰子 2018-01-10
  • 打赏
  • 举报
回复
引用 3 楼 qq_20656883 的回复:
[quote=引用 2 楼 seakingx 的回复:] 用settimeout(5) 如果5秒没反应,获取抛出异常,提示。
我只是增加了一行代码socket_tcp.settimeout(5),我刚才尝试了一下,也是不行的,就是正常链接以后,拔掉网线还是跟以前一样的情况。 [/quote] 过了5秒程序没有抛出异常?
  • 打赏
  • 举报
回复
引用 1 楼 ipqtjmqj 的回复:
我也碰到过这个问题,没有深究,直接改成短连接了
我觉得可以适当深入研究一下,因为socket用的还是蛮广泛的
  • 打赏
  • 举报
回复
引用 2 楼 seakingx 的回复:
用settimeout(5) 如果5秒没反应,获取抛出异常,提示。
我只是增加了一行代码socket_tcp.settimeout(5),我刚才尝试了一下,也是不行的,就是正常链接以后,拔掉网线还是跟以前一样的情况。
陈年椰子 2018-01-09
  • 打赏
  • 举报
回复
用settimeout(5) 如果5秒没反应,获取抛出异常,提示。
ipqtjmqj 2018-01-09
  • 打赏
  • 举报
回复
我也碰到过这个问题,没有深究,直接改成短连接了

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧