2017-06-06 76 views
0

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

我怎么能做一个功能,当我键入关机在服务器终端,它关闭整个服务器?

我已经尝试过这样做:

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

但它不工作。当我输入close()时,没有任何反应。没有。

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

+0

请问您是否可以修改您的文章以包含更多的代码?此代码段中的“服务器”实例是什么?你的服务器程序的整体结构是什么? “关机”是什么意思?完成程序?停止收听新的连接?关闭所有现有连接但保持服务器程序运行? – Hannu

+0

我编辑了第一篇文章。它应该关闭整个服务器(关闭程序) – smaxxx

+0

如果您有兴趣,请再次发表评论。这现在只接受一个并发连接,并且在客户端关闭连接时不能很好地恢复。通常这些都是为了让主程序在accept()中等待,并且当建立一个新的连接时,它启动一个以sock和address作为参数的线程,当主程序返回accept()时,线程处理单个连接。立即。当客户端关闭连接时,服务它的线程终止,而其他客户端连接和主循环保持不变。 – Hannu

回答

0

嗯...有很多问题与代码(“我的IP”和“SERVERIP”很可能不是你想要的,但是这是题外话。

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

但究竟如何,你调用close( )当你在某处输入“shutdown”时?你没有这样做。你的程序在套接字循环中,并没有读取键盘输入。

我没有看到任何添加键盘输入到这个程序。首先,它会增加复杂性,因为您使用两个可能的阻塞输入(套接字输入和键盘输入)进行操作,您需要管理这些输入。这是可能的,但绝对复杂。其次,按Control + C而不是输入“关机”并按回车会更快。

您目前在键盘中断后没有关闭。我把它添加到KeyboardInterrupt内部(你可以移除的外部 - 它没有做任何事情,也没有到达),它现在关闭你的程序,关闭所有连接。请记住,在尝试之前,你的代码底部靠拢()函数前:声明:

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

如果你想有一个远程关机(如果键入“关机”到插座服务器关闭),您可以将其添加到您的服务器回路中:

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

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

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

Hannu

相关问题