A simple echo server which just echo the client supplied data or string
server.py
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
Multi-Process Echo Server
you can try it 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
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 it 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
No comments:
Post a Comment