Python Socket继续倾听并接受新客户

时间:2015-07-12 19:58:18

标签: python sockets raspberry-pi server raspbian

我遇到了python脚本的问题,我没有写自己,而且我对python完全陌生。该脚本在Raspberry Pi上运行并侦听端口8080(套接字)。客户端可以发送诸如" reboot()"之类的命令。问题是当客户端关闭连接时,脚本不再接受新连接并执行命令。

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(("", 8080))
s.listen(1)
conn = s.accept()

while True:
 data = conn[0].recv(1024)
 if data:
    command = ""
    args = ""
    if "(" in data and ")" in data:
        command = data[:data.index("(")]
        args = data[data.index("(") + 1:data.index(")")]
    if "," in args:
        arglist = args.split(",")
    else:
        arglist = args

    if command == "reboot":
        os.system("reboot")
    elif command == "shutdown":
        os.system("shutdown -h now")
    elif command == "reset":
        obja.reset()
        objb.reset()
    else:
        conn[0].sendall("Command doesn't exist!")

脚本在启动时运行,不会终止。这里的最后一行也是原始脚本中的最后一行。在我发布的行之上还有一些代码,但我认为它与套接字问题无关。我尝试将前5行放在While-Loop中,但这并不起作用。 我应该如何重新编写代码,以便在客户端关闭连接时继续执行?非常欢迎任何帮助。

彼得

1 个答案:

答案 0 :(得分:1)

您需要在while循环中放入的代码以conn = s.accept()开头。

您只想设置套接字并拨打bind / listen一次。但是,您希望捕获ConnectionClosed之类的异常,并在发生时再次调用accept。为此,您需要在try / except中添加新添加的while循环体。 except块需要捕获客户端失去连接时发生的任何类型的异常。

祝你好运,编码愉快!