Question: May you help , users can not communicate with each ohter, may you also improve my code? server: import socket import threading import os #

May you help , users can not communicate with each ohter, may you also improve my code?
server:
import socket import threading import os # Folder for shared files shared_folder = os.environ.get("SERVER_SHARED_FILES", "SharedFiles") # Global variables for clients and usernames clients ={} usernames ={} def handle_client(conn, addr): print(f"New connection from {addr}") username = conn.recv(1024).decode() if username: usernames[conn]= username broadcast(f"[{username}] has joined", conn) clients[conn]= addr try: while True: message = conn.recv(1024).decode() if message: if message.startswith("/exit"): disconnect_client(conn) break elif message.startswith("/broadcast"): broadcast(f"[{username}]: {message[10:]}", conn) elif message.startswith("/unicast"): target_user, msg = message.split('',2)[1:] send_to_user(target_user, f"[{username}]: {msg}") elif message.startswith("/files"): list_files(conn) elif message.startswith("/download"): filename = message.split('',1)[1] send_file(conn, filename) else: conn.send("Invalid command.".encode()) except Exception as e: print(f"Error with {username}: {e}") finally: disconnect_client(conn) def broadcast(message, sender_conn=None): for conn in clients.keys(): if conn != sender_conn: conn.send(message.encode()) def send_to_user(target_user, message): for conn, user in usernames.items(): if user == target_user: conn.send(message.encode()) break def list_files(conn): try: files = os.listdir(shared_folder) conn.send(f"Files in {shared_folder}: {','.join(files)}".encode()) except Exception as e: conn.send(f"Error accessing files: {e}".encode()) def send_file(conn, filename): filepath = os.path.join(shared_folder, filename) try: with open(filepath,'rb') as f: conn.send(f"START {os.path.getsize(filepath)}".encode()) while data := f.read(1024): conn.send(data) conn.send("END".encode()) except FileNotFoundError: conn.send("File not found.".encode()) def disconnect_client(conn): username = usernames.get(conn, "Unknown") broadcast(f"[{username}] has left", conn) conn.close() del clients[conn] del usernames[conn] def main(): server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) host = 'localhost' port =5555 server_socket.bind((host, port)) server_socket.listen(5) print(f"Server listening on {host}:{port}") while True: conn, addr = server_socket.accept() threading.Thread(target=handle_client, args=(conn, addr)).start() if __name__=="__main__": main()
client.py:
import socket
import threading
import os
import sys
def receive_messages(conn):
while True:
try:
message = conn.recv(1024).decode()
if message: print(message)
else:
print("Disconnected from server.")
conn.close()
break
except Exception as e: print(f"Error: {e}")
break
def main(username, hostname, port):
conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
conn.connect((hostname, port))
conn.send(username.encode())
print(conn.recv(1024).decode())
except Exception as e:
print(f"Could not connect: {e}")
return
threading.Thread(target=receive_messages, args=(conn,)).start()
while True: command = input(f"{username}>")
if command =="/exit": conn.send("/exit".encode())
break elif command.startswith("/broadcast"): conn.send(f"/broadcast {command}".encode()) elif command.startswith("/unicast"): conn.send(command.encode()) elif command =="/files": conn.send("/files".encode()) elif command.startswith("/download"): conn.send(command.encode()) else: print("Invalid command.") conn.close() if __name__=="__main__": if len(sys.argv)<4: print("Usage: python client.py [username][hostname][port]") else: main(sys.argv[1], sys.argv[2], int(sys.argv[3]))

Step by Step Solution

There are 3 Steps involved in it

1 Expert Approved Answer
Step: 1 Unlock blur-text-image
Question Has Been Solved by an Expert!

Get step-by-step solutions from verified subject matter experts

Step: 2 Unlock
Step: 3 Unlock

Students Have Also Explored These Related Programming Questions!