2015-07-12 247 views
1

我遇到了一个python脚本问题我没有写自己,我完全是python的新手。脚本在Raspberry Pi上运行,并在端口8080(套接字)上侦听。客户端可以发送诸如“rebo​​ot()”之类的命令。问题是当客户端关闭连接时,脚本不再接受新的连接并执行该命令。Python Socket不断监听并接受新客户端

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!") 

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

彼得

+0

可能是因为你不是'close('s.close()')连接以及.. –

+0

不完全一样,但逻辑相似http://stackoverflow.com/questions/31357762/蟒-子 - 变化 - DIR-通客户端 - 服务器/ 31359402#31359402 –

回答

1

你需要把在while循环中的代码开始conn = s.accept()

您只想设置套接字并调用bind/listen一次。但是,您确实需要捕获例外,例如ConnectionClosed,并在发生这种情况时再次致电accept。要做到这一点,您将要包装在try/except中添加的新while循环的主体。 except块将需要捕获客户端失去连接时发生的任何类型的异常。

祝你好运,快乐的编码!