Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python套接字-如何关闭服务器?_Python_Sockets - Fatal编程技术网

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

Python套接字-如何关闭服务器?,python,sockets,Python,Sockets,我试图用Python中的socket模块制作一个简单的聊天系统。一切都正常,除了每次我想关闭服务器时都需要终止进程。我不想每次都这样。 所以我的问题是: 当我在服务器终端中键入shutdown时,它将关闭整个服务器,我如何才能实现这一功能 我已经尝试过这样做: def关闭(自身): 服务器关闭(self) 服务器关闭(自我) 但它不起作用。当我键入close()时,什么也没有发生。没什么 下面是server.py的完整代码: 每一个帮助都是有用的。谢谢。嗯。。。代码有很多问题(您的“我的IP”和

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

当我在服务器终端中键入shutdown时,它将关闭整个服务器,我如何才能实现这一功能

我已经尝试过这样做:

def关闭(自身):
服务器关闭(self)
服务器关闭(自我)

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

下面是server.py的完整代码:
每一个帮助都是有用的。谢谢。

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

close()函数有一个“self”参数,这是没有意义的,因为这不是一个类。如果要从try-except-structure调用close函数,还需要将其移到代码开头。需要先调用shutdown(),然后调用close(),shutdown接受一个参数。我修改了你的close()这样做是可行的

def close():
    server.shutdown(socket.SHUT_RDWR)
    server.close()
    print ("closed")
打开套接字时,还应设置SO\u REUSEADDR以使地址可重用(这意味着您可以在关闭服务器时再次启动服务器,而不是等待一分钟,等待TIME\u WAIT status完成服务器端口):

但是,当您在某处键入“shutdown”时,您到底是如何调用close()的呢?您没有这样做。您的程序处于套接字循环中,没有读取键盘输入

我看不出在这个程序中添加键盘输入有任何意义。首先,它增加了复杂性,因为您正在使用两个可能的阻塞输入(套接字输入和键盘输入)进行操作,并且您需要对此进行管理。这是可能的,但肯定很复杂。其次,按Control+C键而不是键入“shutdown”会更快然后按回车键

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

    except KeyboardInterrupt:
        print("[!] Keyboard Interrupted!")
        close()
        break
如果要远程关闭(如果在套接字中键入“shutdown”,服务器将关闭),可以将其添加到服务器循环中:

if message == "shutdown":
    close()
    exit(0)
还有其他问题。例如,如果启动服务器,连接到它并关闭连接,则服务器将退出,因为它不会返回侦听()

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


Hannu

另一种方法是使用一个默认的管理客户端来控制服务器。当服务器启动时,将创建管理客户端,并且从该客户端管理员可以关闭并在服务器上执行任何管理任务。

您能修改您的帖子以包含更多的代码吗?什么是“服务器”此代码段中的实例?服务器程序的总体结构是什么?什么是“关闭”?完成程序?停止侦听新连接?关闭所有现有连接,但保持服务器程序运行?我编辑了第一篇文章。它应该关闭整个服务器(关闭程序)如果您感兴趣,请再添加一条注释。现在只接受一个同时连接,如果客户端关闭连接,则无法很好地恢复。通常这样做是为了让主程序在accept()中等待,当建立新连接时,它启动一个以sock和address为参数的线程,该线程处理单个连接,而主程序立即返回accept()。当客户端关闭连接时,为其提供服务的线程终止,其他客户端连接和主循环保持不变。
if message == "shutdown":
    close()
    exit(0)