title: Client Server programming in python?
body: <p>Here is source code for multithreaed server and client in python.</p>
  
  <p>In the code client and server closes connection after the job is finished.
  I want to keep the connections alive and send more data over the same connections to <strong>avoid overhead of closing and opening sockets every time</strong>.</p>
  
  <p>Following code is from : <a href="http://www.devshed.com/c/a/Python/Basic-Threading-in-Python/1/" rel="noreferrer">http://www.devshed.com/c/a/Python/Basic-Threading-in-Python/1/</a></p>
  
  <pre><code>import pickle
  import socket
  import threading
  
  # We'll pickle a list of numbers:
  someList = [ 1, 2, 7, 9, 0 ]
  pickledList = pickle.dumps ( someList )
  
  # Our thread class:
  class ClientThread ( threading.Thread ):
  
     # Override Thread's __init__ method to accept the parameters needed:
     def __init__ ( self, channel, details ):
  
        self.channel = channel
        self.details = details
        threading.Thread.__init__ ( self )
  
     def run ( self ):
  
        print 'Received connection:', self.details [ 0 ]
        self.channel.send ( pickledList )
        for x in xrange ( 10 ):
           print self.channel.recv ( 1024 )
        self.channel.close()
        print 'Closed connection:', self.details [ 0 ]
  
  # Set up the server:
  server = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
  server.bind ( ( '', 2727 ) )
  server.listen ( 5 )
  
  # Have the server serve "forever":
  while True:
     channel, details = server.accept()
     ClientThread ( channel, details ).start()
  </code></pre>
  
  <hr>
  
  <pre><code>import pickle
  import socket
  import threading
  
  # Here's our thread:
  class ConnectionThread ( threading.Thread ):
  
     def run ( self ):
  
        # Connect to the server:
        client = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
        client.connect ( ( 'localhost', 2727 ) )
  
        # Retrieve and unpickle the list object:
        print pickle.loads ( client.recv ( 1024 ) )
  
        # Send some messages:
        for x in xrange ( 10 ):
           client.send ( 'Hey. ' + str ( x ) + '\n' )
  
        # Close the connection
        client.close()
  
  # Let's spawn a few threads:
  for x in xrange ( 5 ):
     ConnectionThread().start()
  </code></pre>