Python Socket 不断监听并接受新客户端

标签 python sockets raspberry-pi server raspbian

我的 python 脚本有问题,这个脚本不是我自己编写的,而且我对 python 完全陌生。该脚本在 Raspberry Pi 上运行并监听端口 8080(套接字)。客户端可以发送诸如“rebo​​ot()”之类的命令。问题在于,当客户端关闭连接时,脚本不再接受新连接并执行命令。

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 循环中,但这不起作用。 我应该如何重写代码,以便在客户端关闭连接时继续执行?非常欢迎任何帮助。

彼得

最佳答案

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

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

祝你好运,编码愉快!

关于Python Socket 不断监听并接受新客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31371957/

相关文章:

Python Wave 库字符串到字节

Java并发套接字: not being able to share a variable between threads

ubuntu - 可靠的 : How to handle first login forced password change and push an ssh-key

c - 为什么在用 gcc 编译后一个值消失了?

javascript - 在 Python 中将 postgresql 时间戳转换为 JavaScript 时间戳

python - 对没有年份但有 2 月 29 日的字符串日期列表进行排序

python - 如何在 sphinx 文档中显示和隐藏代码?

python - 通过 gevent websocket 发送二进制数据

ios - 使用套接字的 iOS 应用程序之间是否可以进行进程间通信?

raspberry-pi - Raspberry Pi iBeacon 扫描解析响应