From 850a8cdbedf935ffe1b643dadfa010e55c5aa7a1 Mon Sep 17 00:00:00 2001 From: Akarsh Malik Date: Fri, 2 Oct 2020 01:15:08 +0530 Subject: [PATCH 1/3] conversion of strings to bytes fixed, syntax error fix '()' after print statement --- client.py | 48 +++++++++++++++++++++++++++++++++++++++++------- server.py | 18 +++++++++--------- 2 files changed, 50 insertions(+), 16 deletions(-) diff --git a/client.py b/client.py index a5ed144..d67a444 100644 --- a/client.py +++ b/client.py @@ -1,4 +1,7 @@ import socket, select, string, sys +import socket, sys, threading, getpass, os, pickle +from datetime import datetime + #Helper function (formatting) def display() : @@ -13,10 +16,10 @@ def main(): else: host = sys.argv[1] - port = 5001 + port = 5000 #asks for user name - name=raw_input("\33[34m\33[1m CREATING NEW ID:\n Enter username: \33[0m") + name=input("\33[34m\33[1m CREATING NEW ID:\n Enter username: \33[0m") s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(2) @@ -24,12 +27,42 @@ def main(): try : s.connect((host, port)) except : - print "\33[31m\33[1m Can't connect to the server \33[0m" + print("\33[31m\33[1m Can't connect to the server \33[0m") sys.exit() #if connected - s.send(name) + s.send(name.encode('utf-8')) display() + + def send(): + while True: + try: + sys.stdout.write(f"\033[1;32m{user} (me): \033[0m \033[;1m"); sys.stdout.flush() + message = input() + + c.send(pickle.dumps((user, message))) + except: + print("Error while Sending!") + + def receive(): + while True: + try: + msg = c.recv(1024) + USER, MESSAGE = pickle.loads(msg) + + print(f"\n{USER}: {MESSAGE}") + sys.stdout.write(f"\033[1;32m{user} (me): \033[0m \033[;1m"); sys.stdout.flush() + except: + break + + + send_thread = threading.Thread(target=send) + receive_thread = threading.Thread(target=receive) + + + send_thread.start() + receive_thread.start() +''' while 1: socket_list = [sys.stdin, s] @@ -39,9 +72,9 @@ def main(): for sock in rList: #incoming message from server if sock == s: - data = sock.recv(4096) + data = sock.recv(4096).decode('utf-8') if not data : - print '\33[31m\33[1m \rDISCONNECTED!!\n \33[0m' + print('\33[31m\33[1m \rDISCONNECTED!!\n \33[0m') sys.exit() else : sys.stdout.write(data) @@ -50,8 +83,9 @@ def main(): #user entered a message else : msg=sys.stdin.readline() - s.send(msg) + s.send(msg.encode('utf-8')) display() +''' if __name__ == "__main__": main() diff --git a/server.py b/server.py index dfadf04..2c6dfee 100644 --- a/server.py +++ b/server.py @@ -6,7 +6,7 @@ def send_to_all (sock, message): for socket in connected_list: if socket != server_socket and socket != sock : try : - socket.send(message) + socket.send(message.encode('utf-8')) except : # if connection not available socket.close() @@ -19,7 +19,7 @@ def send_to_all (sock, message): # List to keep track of socket descriptors connected_list = [] buffer = 4096 - port = 5001 + port = 5000 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) @@ -29,7 +29,7 @@ def send_to_all (sock, message): # Add server socket to the list of readable connections connected_list.append(server_socket) - print "\33[32m \t\t\t\tSERVER WORKING \33[0m" + print("\33[32m \t\t\t\tSERVER WORKING \33[0m") while 1: # Get the list sockets which are ready to be read through select @@ -55,9 +55,9 @@ def send_to_all (sock, message): else: #add name and address record[addr]=name - print "Client (%s, %s) connected" % addr," [",record[addr],"]" - sockfd.send("\33[32m\r\33[1m Welcome to chat room. Enter 'tata' anytime to exit\n\33[0m") - send_to_all(sockfd, "\33[32m\33[1m\r "+name+" joined the conversation \n\33[0m") + print("Client (%s, %s) connected" % addr," [",record[addr],"]") + sockfd.send("\33[32m\r\33[1m Welcome to chat room. Enter 'tata' anytime to exit\n\33[0m".encode('utf-8')) + send_to_all(sockfd, f"\33[32m\33[1m\r {name} joined the conversation \n\33[0m".encode('utf-8')) #Some incoming message from a client else: @@ -73,7 +73,7 @@ def send_to_all (sock, message): if data == "tata": msg="\r\33[1m"+"\33[31m "+record[(i,p)]+" left the conversation \33[0m\n" send_to_all(sock,msg) - print "Client (%s, %s) is offline" % (i,p)," [",record[(i,p)],"]" + print("Client (%s, %s) is offline" % (i,p)," [",record[(i,p)],"]") del record[(i,p)] connected_list.remove(sock) sock.close() @@ -86,8 +86,8 @@ def send_to_all (sock, message): #abrupt user exit except: (i,p)=sock.getpeername() - send_to_all(sock, "\r\33[31m \33[1m"+record[(i,p)]+" left the conversation unexpectedly\33[0m\n") - print "Client (%s, %s) is offline (error)" % (i,p)," [",record[(i,p)],"]\n" + send_to_all(sock, "\r\33[31m \33[1m {record[(i,p)]} left the conversation unexpectedly\33[0m\n".encode('utf-8')) + print("Client (%s, %s) is offline (error)" % (i,p)," [",record[(i,p)],"]\n") del record[(i,p)] connected_list.remove(sock) sock.close() From 9423699feec1a20b5174d549c7405feb7cd547c0 Mon Sep 17 00:00:00 2001 From: Akarsh Malik Date: Fri, 2 Oct 2020 01:18:03 +0530 Subject: [PATCH 2/3] conversion of strings to bytes fixed, syntax error fix '()' after print statement 2 --- client.py | 33 +-------------------------------- 1 file changed, 1 insertion(+), 32 deletions(-) diff --git a/client.py b/client.py index d67a444..baa0c0b 100644 --- a/client.py +++ b/client.py @@ -1,6 +1,5 @@ import socket, select, string, sys -import socket, sys, threading, getpass, os, pickle -from datetime import datetime + #Helper function (formatting) @@ -34,35 +33,6 @@ def main(): s.send(name.encode('utf-8')) display() - def send(): - while True: - try: - sys.stdout.write(f"\033[1;32m{user} (me): \033[0m \033[;1m"); sys.stdout.flush() - message = input() - - c.send(pickle.dumps((user, message))) - except: - print("Error while Sending!") - - def receive(): - while True: - try: - msg = c.recv(1024) - USER, MESSAGE = pickle.loads(msg) - - print(f"\n{USER}: {MESSAGE}") - sys.stdout.write(f"\033[1;32m{user} (me): \033[0m \033[;1m"); sys.stdout.flush() - except: - break - - - send_thread = threading.Thread(target=send) - receive_thread = threading.Thread(target=receive) - - - send_thread.start() - receive_thread.start() -''' while 1: socket_list = [sys.stdin, s] @@ -85,7 +55,6 @@ def receive(): msg=sys.stdin.readline() s.send(msg.encode('utf-8')) display() -''' if __name__ == "__main__": main() From 110e3dfb356aef920e1b6492672c64d739db90cf Mon Sep 17 00:00:00 2001 From: Akarsh Malik Date: Fri, 2 Oct 2020 01:49:51 +0530 Subject: [PATCH 3/3] Multi-client setup using multithreading in python --- client.py | 93 ++++++++++++++++++++-------------------- server.py | 126 +++++++++++++++--------------------------------------- 2 files changed, 81 insertions(+), 138 deletions(-) diff --git a/client.py b/client.py index baa0c0b..0eff721 100644 --- a/client.py +++ b/client.py @@ -1,4 +1,4 @@ -import socket, select, string, sys +import socket, sys, threading, getpass, os, pickle @@ -8,53 +8,52 @@ def display() : sys.stdout.write(you) sys.stdout.flush() -def main(): - if len(sys.argv)<2: - host = raw_input("Enter host ip address: ") - else: - host = sys.argv[1] +if len(sys.argv)<2: + host = input("Enter host ip address: ") +else: + host = sys.argv[1] - port = 5000 +port = 5003 - #asks for user name - name=input("\33[34m\33[1m CREATING NEW ID:\n Enter username: \33[0m") - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - s.settimeout(2) +#asks for user name +name=input("\33[34m\33[1m CREATING NEW ID:\n Enter username: \33[0m") +s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +s.settimeout(2) - # connecting host - try : - s.connect((host, port)) - except : - print("\33[31m\33[1m Can't connect to the server \33[0m") - sys.exit() - - #if connected - s.send(name.encode('utf-8')) - display() - - while 1: - socket_list = [sys.stdin, s] - - # Get the list of sockets which are readable - rList, wList, error_list = select.select(socket_list , [], []) - - for sock in rList: - #incoming message from server - if sock == s: - data = sock.recv(4096).decode('utf-8') - if not data : - print('\33[31m\33[1m \rDISCONNECTED!!\n \33[0m') - sys.exit() - else : - sys.stdout.write(data) - display() - - #user entered a message - else : - msg=sys.stdin.readline() - s.send(msg.encode('utf-8')) - display() - -if __name__ == "__main__": - main() +# connecting host +try : + s.connect((host, port)) +except : + print("\33[31m\33[1m Can't connect to the server \33[0m") + sys.exit() + +def send(): + while True: + try: + sys.stdout.write(f"\033[1;32m{name} (me): \033[0m \033[;1m"); sys.stdout.flush() + message = input() + + s.send(pickle.dumps((name, message))) + except: + print("Error while Sending!") + +def receive(): + while True: + try: + msg = s.recv(1024) + USER, MESSAGE = pickle.loads(msg) + + if (USER == name): + + print(f"\nYou: {MESSAGE}") + #sys.stdout.write(f"\033[1;32m{name} (me): \033[0m \033[;1m"); sys.stdout.flush() + else: + sys.stdout.write(f"\033[1;32m {USER}: \033[0m \033[;1m"); sys.stdout.flush() + except: + break +send_thread = threading.Thread(target=send) +receive_thread = threading.Thread(target=receive) + +send_thread.start() +receive_thread.start() diff --git a/server.py b/server.py index 2c6dfee..67a0924 100644 --- a/server.py +++ b/server.py @@ -1,97 +1,41 @@ -import socket, select +import socket, threading, pickle -#Function to send message to all connected clients -def send_to_all (sock, message): - #Message not forwarded to server and sender itself - for socket in connected_list: - if socket != server_socket and socket != sock : - try : - socket.send(message.encode('utf-8')) - except : - # if connection not available - socket.close() - connected_list.remove(socket) - -if __name__ == "__main__": - name="" - #dictionary to store address corresponding to username - record={} - # List to keep track of socket descriptors - connected_list = [] - buffer = 4096 - port = 5000 - - server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - - server_socket.bind(("localhost", port)) - server_socket.listen(10) #listen atmost 10 connection at one time - - # Add server socket to the list of readable connections - connected_list.append(server_socket) - - print("\33[32m \t\t\t\tSERVER WORKING \33[0m") +s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +PORT = 5003 +SERVER = socket.gethostbyname(socket.gethostname()) +s.bind((SERVER, PORT)) - while 1: - # Get the list sockets which are ready to be read through select - rList,wList,error_sockets = select.select(connected_list,[],[]) +users = [] - for sock in rList: - #New connection - if sock == server_socket: - # Handle the case in which there is a new connection recieved through server_socket - sockfd, addr = server_socket.accept() - name=sockfd.recv(buffer) - connected_list.append(sockfd) - record[addr]="" - #print "record and conn list ",record,connected_list +#Function to send message to all connected clients +def client(client_socket, addr, USER): + while True: + try: + msg = client_socket.recv(1024) + user , message = pickle.loads(msg) + + for client in users: + client.send(pickle.dumps((user,message))) + + except: + print("Brute force close") + - #if repeated username - if name in record.values(): - sockfd.send("\r\33[31m\33[1m Username already taken!\n\33[0m") - del record[addr] - connected_list.remove(sockfd) - sockfd.close() - continue - else: - #add name and address - record[addr]=name - print("Client (%s, %s) connected" % addr," [",record[addr],"]") - sockfd.send("\33[32m\r\33[1m Welcome to chat room. Enter 'tata' anytime to exit\n\33[0m".encode('utf-8')) - send_to_all(sockfd, f"\33[32m\33[1m\r {name} joined the conversation \n\33[0m".encode('utf-8')) - - #Some incoming message from a client - else: - # Data from client - try: - data1 = sock.recv(buffer) - #print "sock is: ",sock - data=data1[:data1.index("\n")] - #print "\ndata received: ",data - - #get addr of client sending the message - i,p=sock.getpeername() - if data == "tata": - msg="\r\33[1m"+"\33[31m "+record[(i,p)]+" left the conversation \33[0m\n" - send_to_all(sock,msg) - print("Client (%s, %s) is offline" % (i,p)," [",record[(i,p)],"]") - del record[(i,p)] - connected_list.remove(sock) - sock.close() - continue +def threads(): + s.listen() + while True: + try: + client_socket, addr = s.accept() + user = client_socket.recv(1024).decode('utf-8') - else: - msg="\r\33[1m"+"\33[35m "+record[(i,p)]+": "+"\33[0m"+data+"\n" - send_to_all(sock,msg) - #abrupt user exit - except: - (i,p)=sock.getpeername() - send_to_all(sock, "\r\33[31m \33[1m {record[(i,p)]} left the conversation unexpectedly\33[0m\n".encode('utf-8')) - print("Client (%s, %s) is offline (error)" % (i,p)," [",record[(i,p)],"]\n") - del record[(i,p)] - connected_list.remove(sock) - sock.close() - continue - - server_socket.close() - + users.append(client_socket) + + thread = threading.Thread(target=client, args=(client_socket, addr, user)) + thread.start() + + except: + s.close() + +print("\033[1;32m[STARTING] Server!\033[0m \033[;1m") +threads()