关闭线程时套接字未关闭

时间:2018-11-01 14:28:36

标签: python

在下面的代码中,尽管线程似乎正在停止套接字,但似乎没有被释放。不知道我在犯什么错误。 当我尝试第二次启动时,它抛出错误“地址已在使用中”。我查找了很多堆栈溢出建议,并没有太大帮助。

这是我的代码:

import threading
import time
import socket

class TCPServer(object):
   def __init__(self):
     self.stop_thread = threading.Event()

   def startServer(self, ip="localhost", port=12345):
     self.ip = ip
     self.port = port
     t = threading.Thread(target=self.server, args=(self.stop_thread, 
                          "stop_event"))
     t.daemon = True
     t.start()

   def server(self, stop_event, arg):
     self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
     sock.bind((self.ip, self.port))
     sock.listen(5)
     connection = ""
     while not stop_event.is_set():
       connection, addr = self.sock.accept()
       data = connection.recv(50000)
       if data:
         connection.send(self.response)
     connection.close()
     #Tried with below statements - still fails
     #self.sock.shutdown(socket.SHUT_RDWR)
     #self.sock.close()


   def stopServer(self):
     self.stop_thread.set()


if __name__ == "__main__":
   server = TCPServer()
   server.startServer("localhost", 12345)
   time.sleep(5)
   server.stopServer()
   time.sleep(15)    
   server.startServer("localhost", 12345)
   time.sleep(5)
   server.stopServer()

我通过强制关闭stopServer()中的套接字来找到解决方法,如下所示:

   def stopServer(self):
     self.stop_thread.set()
     self.sock.shutdown(socket.SHUT_RDWR)
     self.sock.close()

但是我认为这不是一个好的解决方案。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

for (( i=0; i < 360; i+=$a )) do
   name=%(printf "%03d" $i)
   convert $image -rotate $i "temp/$name.jpg"
done
convert -delay $d "temp/*.jpg" out.gif

所以大部分都是次要的东西。您需要检查事件是否已设置,而不仅仅是事件是否为真。您可以在event-object docs中阅读更多内容。这意味着您永远不会离开内循环。离开内循环后,您需要显式关闭连接和套接字。