Skip to content

Commit 3f7b423

Browse files
committed
test
1 parent e2ddeb5 commit 3f7b423

File tree

2 files changed

+69
-23
lines changed

2 files changed

+69
-23
lines changed

client.py

Lines changed: 47 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,70 @@
11
import socket
22
import threading
3-
4-
# Choose a username
5-
username = input("Enter your username: ")
3+
import tkinter
4+
from tkinter import simpledialog
65

76
# Client setup
87
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
98
client.connect(('localhost', 12345))
109

11-
# Listening to server and sending messages
1210
def receive_messages():
1311
while True:
1412
try:
1513
message = client.recv(1024).decode('utf-8')
1614
if message == 'USERNAME':
1715
client.send(username.encode('utf-8'))
1816
else:
19-
print(message)
17+
chat_box.insert(tkinter.END, message + '\n')
2018
except:
2119
print('An error occurred!')
2220
client.close()
2321
break
2422

25-
def write_messages():
26-
while True:
27-
message = f'{username}: {input("")}'
28-
client.send(message.encode('utf-8'))
23+
def write_messages(event=None):
24+
message = message_entry.get()
25+
message_entry.set('')
26+
if message.startswith("@"):
27+
recipient, private_message = message.split(' ', 1)
28+
message = f'{recipient} {private_message}'
29+
else:
30+
message = f'{username}: {message}'
31+
client.send(message.encode('utf-8'))
32+
33+
def on_typing(event=None):
34+
typing_message = f"{username} is typing..."
35+
client.send(typing_message.encode('utf-8'))
36+
37+
def stop_typing(event=None):
38+
typing_message = f"{username} stopped typing."
39+
client.send(typing_message.encode('utf-8'))
40+
41+
# GUI setup
42+
root = tkinter.Tk()
43+
root.title("Chat Application")
44+
45+
message_frame = tkinter.Frame(root)
46+
message_frame.pack()
47+
48+
scrollbar = tkinter.Scrollbar(message_frame)
49+
scrollbar.pack(side=tkinter.RIGHT, fill=tkinter.Y)
50+
51+
chat_box = tkinter.Text(message_frame, height=15, width=50, yscrollcommand=scrollbar.set)
52+
chat_box.pack(side=tkinter.LEFT, fill=tkinter.BOTH)
53+
chat_box.pack()
54+
55+
message_entry = tkinter.StringVar()
56+
entry_field = tkinter.Entry(root, textvariable=message_entry)
57+
entry_field.bind("<Return>", write_messages)
58+
entry_field.bind("<KeyPress>", on_typing)
59+
entry_field.bind("<KeyRelease>", stop_typing)
60+
entry_field.pack()
61+
62+
send_button = tkinter.Button(root, text="Send", command=write_messages)
63+
send_button.pack()
64+
65+
username = simpledialog.askstring("Username", "Enter your username", parent=root)
2966

3067
receive_thread = threading.Thread(target=receive_messages)
3168
receive_thread.start()
3269

33-
write_thread = threading.Thread(target=write_messages)
34-
write_thread.start()
70+
tkinter.mainloop()

server.py

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,37 @@
66
server.bind(('localhost', 12345))
77
server.listen()
88

9-
clients = []
10-
usernames = []
9+
clients = {}
10+
usernames = {}
1111

1212
# Broadcast messages to all clients
13-
def broadcast(message):
13+
def broadcast(message, sender_client=None):
1414
for client in clients:
15-
client.send(message)
15+
if client != sender_client:
16+
client.send(message)
1617

1718
# Handle messages from clients
1819
def handle_client(client):
1920
while True:
2021
try:
2122
message = client.recv(1024)
22-
broadcast(message)
23+
if message:
24+
message_decoded = message.decode('utf-8')
25+
if message_decoded.startswith("@"):
26+
recipient, private_message = message_decoded.split(' ', 1)
27+
recipient_username = recipient[1:]
28+
if recipient_username in usernames:
29+
recipient_client = clients[usernames[recipient_username]]
30+
recipient_client.send(f"Private from {usernames[client]}: {private_message}".encode('utf-8'))
31+
else:
32+
client.send(f"User {recipient_username} not found!".encode('utf-8'))
33+
else:
34+
broadcast(message, client)
2335
except:
24-
index = clients.index(client)
25-
clients.remove(client)
26-
client.close()
27-
username = usernames[index]
36+
username = usernames.pop(client, None)
37+
clients.pop(username, None)
2838
broadcast(f'{username} has left the chat!'.encode('utf-8'))
29-
usernames.remove(username)
39+
client.close()
3040
break
3141

3242
# Receive connections from clients
@@ -37,8 +47,8 @@ def receive_connections():
3747

3848
client.send('USERNAME'.encode('utf-8'))
3949
username = client.recv(1024).decode('utf-8')
40-
usernames.append(username)
41-
clients.append(client)
50+
clients[username] = client
51+
usernames[client] = username
4252

4353
print(f'Username of the client is {username}')
4454
broadcast(f'{username} has joined the chat!'.encode('utf-8'))

0 commit comments

Comments
 (0)