Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 48 additions & 46 deletions client.py
Original file line number Diff line number Diff line change
@@ -1,57 +1,59 @@
import socket, select, string, sys
import socket, sys, threading, getpass, os, pickle



#Helper function (formatting)
def display() :
you="\33[33m\33[1m"+" You: "+"\33[0m"
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()
126 changes: 35 additions & 91 deletions server.py
Original file line number Diff line number Diff line change
@@ -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()