繁体   English   中英

Python Sockets - 如何关闭服务器?

[英]Python Sockets - How to shut down the server?

我试图用 Python 中的 socket 模块制作一个简单的聊天系统。 一切正常,除了每次我想关闭服务器时都需要终止进程。 而且我不想每次都这样做。 所以我的问题是:

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

我已经尝试过这样做:

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

但它不起作用。 当我输入 close() 时,什么也没有发生。 没什么。

这里是 server.py 的完整代码: https : //pastebin.com/gA4QYmQe每一个帮助都是有用的。 谢谢。

嗯...代码有很多问题(您的“我的 IP”和“SERVERIP”可能不是您想要的,但这无关紧要。

您的 close() 函数有一个“self”参数,这是毫无意义的,因为这不是一个类。 如果您想从 try-except 结构中调用它,您还需要将 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”并按 Enter 键会更快。

您当前不会在键盘中断后调用 close。 我将此添加到内部 KeyboardInterrupt (您可以删除的外部 - 它没有做任何事情并且永远不会到达),现在它会整齐地关闭您的程序,关闭所有连接。 记得在 try: 语句之前将 close() 函数从代码底部移到前面:

    except KeyboardInterrupt:
        print("[!] Keyboard Interrupted!")
        close()
        break

如果您想要远程关闭(如果您在套接字中键入“关闭”,服务器将关闭),您可以将其添加到您的服务器循环中:

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

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

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

哈努

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM