使用python中的一个客户端检查服务器是否可用

使用python中的一个客户端检查服务器是否可用,python,Python,我想写一个代码来实现下面的功能 我已经用python编写了一个客户机(c1)和3个服务器(s1、s2和s3) C1将检查是否能够连接到s1。如果是,它将睡眠2分钟。它将在2分钟后再次唤醒,并检查s1是否可连接。如果否,则将检查s2。如果s2正在收听,则c1将进入睡眠状态2分钟。这将继续发生 现在,我的问题是,我可以检查s1,但不能使用if-else编码 s=socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: s.

我想写一个代码来实现下面的功能

我已经用python编写了一个客户机(c1)和3个服务器(s1、s2和s3)

C1将检查是否能够连接到s1。如果是,它将睡眠2分钟。它将在2分钟后再次唤醒,并检查s1是否可连接。如果否,则将检查s2。如果s2正在收听,则c1将进入睡眠状态2分钟。这将继续发生

现在,我的问题是,我可以检查s1,但不能使用if-else编码

s=socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    try:
        s.connect(('111.111.1.1', 2222))
        time.sleep(120) 
    except Exception as inst:
        print("not ready1")   
        try:
            s.connect(('11.22.22.2', 2212))
            time.sleep(120) 
        except Exception as inst:
            print("not ready2")
            try:
                s.connect(('1.1.1.33', 1234)) 
                time.sleep(120) 
            except Exception as inst:
                print("not ready3") 
我想使用if-else循环来实现这一点。还要确保此代码执行无限时间。现在,它将只执行一次

那适合你吗

import socket
import time


def run(ip, port):
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((ip, port))
        return True
    except Exception:
        return False


while True:
    if run('111.111.1.1', 2222):
        print('s1 read')
        time.sleep(120)
    elif run('11.22.22.2', 2222):
        print('s2 read')
        time.sleep(120)
    else:
        print('s1 and s2 not read')
那适合你吗

import socket
import time


def run(ip, port):
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((ip, port))
        return True
    except Exception:
        return False


while True:
    if run('111.111.1.1', 2222):
        print('s1 read')
        time.sleep(120)
    elif run('11.22.22.2', 2222):
        print('s2 read')
        time.sleep(120)
    else:
        print('s1 and s2 not read')

编辑:考虑到这一点后,您将使用旧的结果达到递归深度,您将不得不使用一个循环来处理所显示的代码。还有另一个答案显示了一个很好的结果


你能把代码放在函数中递归调用吗?我不是100%清楚你想做什么,我想你应该检查3台服务器,每次间隔2分钟检查1台

s=socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
def recursive_function():
    try:
        s.connect(('111.111.1.1', 2222))
        time.sleep(120) 
    except OSError as inst:
        print("not ready1") 
        try:
            s.connect(('11.22.22.2', 2212))
            time.sleep(120) 
        except OSError as inst:
            print("not ready2") 
    return recursive_function()
recursive_function()
另外,正如其他人所发布的,捕获异常不是一个好主意,除非您特别需要捕获异常(通常用于清理,然后再次引发异常) 在这个功能上也有很多改进的空间,我只是让它“可行”,但我不会说这是一个好结果


您可能想了解函数式编程方法,听起来这就是您要做的

edit:考虑到这一点后,您将使用旧结果达到递归深度,您将不得不使用一个循环来处理所显示的代码。还有另一个答案显示了一个很好的结果


你能把代码放在函数中递归调用吗?我不是100%清楚你想做什么,我想你应该检查3台服务器,每次间隔2分钟检查1台

s=socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
def recursive_function():
    try:
        s.connect(('111.111.1.1', 2222))
        time.sleep(120) 
    except OSError as inst:
        print("not ready1") 
        try:
            s.connect(('11.22.22.2', 2212))
            time.sleep(120) 
        except OSError as inst:
            print("not ready2") 
    return recursive_function()
recursive_function()
另外,正如其他人所发布的,捕获异常不是一个好主意,除非您特别需要捕获异常(通常用于清理,然后再次引发异常) 在这个功能上也有很多改进的空间,我只是让它“可行”,但我不会说这是一个好结果


您可能想了解函数式编程方法,听起来这就是您要做的

不鼓励使用
作为e:
的例外,这不是一个好主意。我不确定我是否理解问题所在,你能更具体一点吗?当你想检查s3时?我只想检查c1是否能够连接到s2。如果不是,c1应该检查s3。@新手:请编辑您的问题。不鼓励使用
异常,因为e:
是不好的。我不确定我是否理解问题所在,你能更具体一点吗?当你想检查s3时?我只想检查c1是否能够连接到s2。如果不是,c1应该检查s3。@新手:请编辑您的问题。Python中不能有无限递归循环,以防所有服务器都永远响应。我猜您遇到了一个
最大递归深度超出
的错误。在这种情况下,
OSError
是要检查的正确异常吗?我对套接字库不太熟悉。在Python中不能有无限递归循环,以防所有服务器都永远响应。我猜您遇到了一个
最大递归深度超出
的错误。在这种情况下,
OSError
是要检查的正确异常吗?我不太熟悉套接字库。我将函数用作线程。不确定我是否可以使用thread执行此操作我在使用thread时没有问题,但您需要更改此算法。我将函数用作线程。我不确定我是否可以使用thread来实现这一点。我使用thread没有问题,但您需要更改此算法