【问题标题】:Shut down a socket server - Python关闭套接字服务器 - Python
【发布时间】:2020-12-16 00:54:08
【问题描述】:

我一直在尝试在 2 个客户之间创建聊天。 我还需要检查是否有 1 个客户端正在断开连接,以便关闭服务器。

我不知道为什么它不起作用,有人可以帮助我吗?

这是我的代码:

from threading import Thread
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(("localhost", 1234))
s.listen(5)
def handleclient(sender,reciever):
    while True:
        data = sender.recv(1024)
        if data == "":
             close()
        else:
            reciever.send(data)
def close():
    s.shutdown(socket.SHUT_RDWR)
    s.close()
    print ("closed")
while True:
    (client_s, client_addr) = s.accept()
    (client_s1, client_addr1) = s.accept()
    t = Thread(target=handleclient, args=(client_s,client_s1))
    t1 = Thread(target=handleclient, args=(client_s1,client_s))
    t.start()
    t1.start()

【问题讨论】:

标签: python sockets


【解决方案1】:

它不起作用,因为你在知道你想要它做什么之前已经编写了代码......有点吹毛求疵,但你真的首先用英语(或任何你的第一语言)描述了预期会发生什么。

除此之外,if data == "": recv 返回 byte 字符串有一个真正的错误,所以它至少应该是if data == b"":

另一个问题在于s.shutdown(socket.SHUT_RDWR)s 未处于连接状态(如 senderreciever 是)但处于 正在侦听 状态。关闭它没有意义,它应该会引发错误。

但是干净地关闭服务器并不是那么容易。主线程在accept 上等待s。如果你从另一个线程关闭它,你会得到一个异常,所以你必须在 try 块中保护它。

当两个客户端之间的对话结束时,您应该决定主线程应该发生什么。当前,您正试图停止服务器,但是围绕 accept 调用的 while True 循环实际上没有任何意义。在不知道我无法向您推荐固定代码的情况下...

【讨论】:

  • 如果没有发送任何内容,sender.recv(1024) 不会阻止吗? ... 停止其跟踪中的 while 循环?
  • @wwii:它确实在子线程中。确实可以在子线程中实现graceful shutdown,但这并没有说明在主线程中使用监听套接字做什么。
  • 我必须记住那句话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-02
  • 2017-08-05
  • 1970-01-01
  • 2020-09-17
  • 2017-03-06
  • 2013-01-22
  • 1970-01-01
相关资源
最近更新 更多