Python套接字 - 如何关闭服务器?

时间:2017-06-06 10:37:05

标签: python sockets

我尝试用Python中的套接字模块创建一个简单的聊天系统。一切正常,除了我每次想要关闭服务器时都需要杀死进程。我不想每次都这样做。 所以我的问题是:

如何创建一个功能,当我在服务器终端中键入 shutdown 时,它会关闭整个服务器?

我已经尝试过这样做了:

def close(self): server.close(self) server.shutdown(self)

但它不起作用。当我输入close()时,没有任何反应。什么都没有。

继承server.py的完整代码: https://pastebin.com/gA4QYmQe 每个帮助都很有用。感谢。

2 个答案:

答案 0 :(得分:0)

嗯......代码有很多问题(你的#34;我的IP"和#34; SERVERIP"可能不是你想要的,但这不是重点。

你的close()函数有一个" self"参数,这是没有意义的,因为这不是一个类。如果要从try-except -structure中调用close函数,还需要将close函数移动到代码的开头。您需要先调用shutdown()然后再调用close(),然后shutdown接受一个参数。我修改了你的close()来做到这一点,它的工作原理。

def close():
    server.shutdown(socket.SHUT_RDWR)
    server.close()
    print ("closed")

当您打开套接字时,还应设置SO_REUSEADDR以使地址可重用(这意味着如果关闭它可以再次启动服务器,而不是等待TIME_WAIT状态完成服务器端口一分钟):

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

但是当你输入" shutdown"时,你究竟是怎么调用close()的?某处?你不是这样做的。你的程序在套接字循环中,而不是读取键盘输入。

我认为无论如何在此程序中添加键盘输入都没有意义。首先,当您使用两个可能阻塞的输入(套接字输入和键盘输入)进行操作时,它会增加复杂性,您需要对此进行管理。它有可能但绝对复杂。其次,按Control + C而不是键入" shutdown"会更快。然后进入。

键盘中断后,您当前不会调用close。我把它添加到内部KeyboardInterrupt(外部你可以删除 - 它没有做任何事情,永远不会到达),它现在整齐地关闭你的程序,关闭所有连接。记得在try:statement:

之前将close()函数从代码底部移到前面
    except KeyboardInterrupt:
        print("[!] Keyboard Interrupted!")
        close()
        break

如果您想要远程关闭(如果您键入"关闭"到服务器,服务器将关闭),您可以将其添加到服务器循环:

if message == "shutdown":
    close()
    exit(0)

还有其他问题。例如,如果启动服务器,连接到它并关闭连接,则服务器退出,因为它不会返回listen()。

这也是(在我看来)编程有点糟糕,因为你使用" server"作为全球变量。我宁愿创建一个类并将所有套接字操作放入其中,但如果样式不重要,这应该可行。

哈努哈利

答案 1 :(得分:0)

另一种方法是让默认的admin-client可以控制服务器。服务器启动时将创建Admin-client,并且可以从该客户端admin关闭并在服务器上执行任何管理任务。