diff --git a/client.py b/client.py index a5ed144..0eff721 100644 --- a/client.py +++ b/client.py @@ -1,4 +1,6 @@ -import socket, select, string, sys +import socket, sys, threading, getpass, os, pickle + + #Helper function (formatting) def display() : @@ -6,52 +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 = 5001 +port = 5003 - #asks for user name - name=raw_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) - 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) - 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) - 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 dfadf04..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) - 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 = 5001 - - 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") - send_to_all(sockfd, "\33[32m\33[1m\r "+name+" joined the conversation \n\33[0m") - - #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") - 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()