Simple Echo Server in python using Sockets

A simple echo server which just echo the client supplied data or string

code :  Server.py

 #!/usr/bin/python  
   
 import socket  
   
 tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
 tcpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  
   
 tcpSocket.bind(("0.0.0.0", 8000))  
 tcpSocket.listen(2)  
   
   
 while 1:  
  print "Waiting for a Client ... "  
  (client, (ip, sock)) = tcpSocket.accept()  
   
  print "Received connection from : ", ip  
  client.send("Press Return or Ctrl+C to close..\n")  
  print "Starting ECHO output ... "  
   
  data = 'dummy'  
   
  while len(data):  
  data = client.recv(2048)  
  if len(data)==1:  
   print "Closing connection with ", ip  
   client.close()  
   print "Connection closed successfully.!!"  
   print "---------------------------------"  
   break  
  if len(data)==0:  
   print "Some Error in connection with ", ip  
   print "Connection closed with ", ip  
   print "---------------------------------"  
   break  
  print "Client sent:", data  
  client.send(data)  
   
 tcpSocket.close()  
   

But the above server code process only a single client at a time.


Now with the use of threading we can solve this problem. Here is the second echo server which handle multiple connection with threads

Threaded_server.py

 #!/usr/bin/python  
   
 import thread  
 import socket  
   
 tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
 tcpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  
   
 tcpSocket.bind(("0.0.0.0", 8000))  
 tcpSocket.listen(2)  
   
 def conn_handler(client, ip, thread_id):  
      print "[T%d]Received connection from : %r" % (thread_id, ip)  
      client.send("Press Return or Ctrl+C to close..\n")  
      print "[T%d]Starting echo output..." % thread_id  
      data = 'dummy'  
      while len(data):  
           data = client.recv(2048)  
           if len(data)==1:  
                print "[T%d]Closing connection with %r" % (thread_id, ip)  
                client.close()  
                print "[T%d]Connection closed successfully.!!" % thread_id  
                print "------------------------------------"  
                break  
           if len(data)==0:  
                print "[T%d]Some Error in connection with %r" % (thread_id, ip)  
                print "[T%d]Connection closed with %r" % (thread_id, ip)  
                print "------------------------------------"  
                break  
           print "[T%d]Client sent: %s" % (thread_id, data)  
           client.send(data)  
   
   
 thread_id = 0  
 while 1:  
      thread_id = thread_id + 1  
      print "Waiting for Client ...\n"  
      (client, (ip, sock)) = tcpSocket.accept()  
   
      try:  
           thread.start_new_thread(conn_handler, (client, ip, thread_id, ))  
      except:  
           print "Error: Unable to start thread [T%d]\n" % thread_id  
   
 tcpSocket.close()  


Multi-Process Echo Server

 #!/usr/bin/python  
   
 from multiprocessing import Process  
 import socket  
 import os  
 import signal  
   
 tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
 tcpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  
   
 tcpSocket.bind(("0.0.0.0", 8000))  
 tcpSocket.listen(2)  
   
 def conn_handler(client, ip, Child_id):  
      print "[C%d]Received connection from : %r" % (Child_id, ip)  
      print "[C%d]Starting echo output... " % Child_id  
      data = 'dummy'  
      while len(data):  
           data = client.recv(2048)  
           if len(data)==0:  
                print "[C%d]Closing connection with %r" % (Child_id, ip)  
                client.close()  
                print "[C%d]Connection closed with %r" % (Child_id, ip)  
                os.kill(os.getpid(), signal.SIGTERM)  
           print "[C%d]Client sent: %s" % (Child_id, data)  
           client.send(data)  
   
 def main():  
      Child_id = 0  
      while 1:  
           Child_id = Child_id + 1  
           print "Waiting for Client ...\n"  
           (client, (ip, sock)) = tcpSocket.accept()  
   
           try:  
                Process(target=conn_handler, args=(client, ip, Child_id)).start()  
           except:  
                print "Error: Uable to start Child Process.!![C%d]" % Child_id  
        
      tcpSocket.close()  
   
   
 if __name__ == "__main__":  
      main()  

you can try out with nc, to close the connection just press 'Ctrl + C' or use the below client.py code to communicate with multiprocess_server.py

Client.py

 #!/usr/bin/python  
 import socket  
 import sys  
 tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
 tcpSocket.connect((sys.argv[1], int(sys.argv[2])))  
 print "Input some string : ['quit' to exit]"  
 data = "dummy"  
 while 1:  
      data = raw_input("|> ")  
      if data=="quit":  
           tcpSocket.close()  
           break  
      tcpSocket.sendall(data)  
      result = tcpSocket.recv(2048)  
      print result