title: Multi Threaded TCP server in Python
body: <p>I have created a simple multi threaded tcp server using python's threding module. This server creates a new thread each time a new client is connected.</p>
  
  <pre><code>#!/usr/bin/env python
  
  import socket, threading
  
  class ClientThread(threading.Thread):
  
      def __init__(self,ip,port):
          threading.Thread.__init__(self)
          self.ip = ip
          self.port = port
          print "[+] New thread started for "+ip+":"+str(port)
  
  
      def run(self):    
          print "Connection from : "+ip+":"+str(port)
  
          clientsock.send("\nWelcome to the server\n\n")
  
          data = "dummydata"
  
          while len(data):
              data = clientsock.recv(2048)
              print "Client sent : "+data
              clientsock.send("You sent me : "+data)
  
          print "Client disconnected..."
  
  host = "0.0.0.0"
  port = 9999
  
  tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  
  tcpsock.bind((host,port))
  threads = []
  
  
  while True:
      tcpsock.listen(4)
      print "\nListening for incoming connections..."
      (clientsock, (ip, port)) = tcpsock.accept()
      newthread = ClientThread(ip, port)
      newthread.start()
      threads.append(newthread)
  
  for t in threads:
      t.join()
  </code></pre>
  
  <p>Then I opened two new terminals and connected to the server using netcat. Then, when I type and send my first data to the server using the first terminal I connected, reply from the server comes to the other terminal and first connection got disconnected. I guessed the reason but I am doubtful whether this happens because <strong>clientsock</strong> variable is overwritten so that it refers to the second connection's socket. Am I correct and then how to avoid that? </p>
  
  <p>Is there a way other than using an array with limited number of socket variables and using each variable for each connection?</p>