Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
loeasy68
GitHub Repository: loeasy68/loeasy68.github.io
Path: blob/main/Business/Desktop/Chat/client.py
2941 views
1
import socket
2
import threading
3
import tkinter
4
import tkinter.scrolled
5
from tkinter import simpledialog
6
7
HOST = "0.0.0.0"
8
PORT = 65535
9
10
class Client():
11
12
def __init__(self, host, port):
13
14
self.sock = socket.socket(socket.AD_INET, socket.SOCK_STREAM)
15
self.sock.connent((host, port))
16
17
mag = tkinter.Tk()
18
msg.withdraw()
19
20
self.nickname = simpledialog.askstring("Nickname", "Please choose a nickname", parent=msg)
21
22
self.gui_done = False
23
self.running = True
24
25
gui_thread = threading.Thread(target=self.gui_loop)
26
receive_thread = threading.Thread(target=self.receive)
27
28
gui_thread.start()
29
receive_thread.start()
30
31
def gui_loop(self):
32
self.win = tkinter.Tk()
33
self.win.configure(bg="lightgray")
34
35
self.chat_label = tkinter.Label(self.win, text="Chat:", bg="lightgray")
36
self.chat_label.config(font=("Arial", 12))
37
self.chat_label.pack(padx=20, pady=5)
38
39
self.text_area = tkinter.scrolledtext.ScrolledText(self.win)
40
self.text_area.config(font=("Arial", 12))
41
self.text_area.pack(padx=20, pady=5)
42
43
self.msg_label = tkinter.Label(self.win, text="Message:", bg="lightgray")
44
self.msg_label.config(font=("Arial", 12))
45
self.msg_label.pack(padx=20, pady=5)
46
47
self.input_area = tkinter.Text(self.win, height=3)
48
self.input_area.pack(padx=20, pady=5)
49
50
self.send_button = tkinter.Button(self.win, text="Send", command=self.write)
51
52
self.send_button.config(font=("Arial", 12))
53
self.send_button.pack(padx=20, pady=5)
54
55
self.gui_done = True
56
57
self.win.protocol("WM_DELETE_WINDOW", self.stop)
58
59
self.win.mainloop()
60
61
def write(self):
62
message = f"{self.nickname}: {self.input_area.get('1.0', 'end')}"
63
self.sock.send(message.encode('utf-8'))
64
self.input_area.delete('1.0', 'end')
65
66
67
def stop(self):
68
self.running = False
69
self.win.destroy()
70
self.sock.close()
71
exit(0)
72
73
def receive(self):
74
while self.running:
75
try:
76
message = self.sock.recv(1024)
77
if message == 'NICK':
78
self.sock.send(self.nickname.encode('utf-8'))
79
else:
80
if self.gui_done:
81
self.text_area.config(state='normal')
82
self.insert('end', message)
83
self.text_area.yview('end')
84
self.text_area.config(state='disabled')
85
except ConnentionAbortedError:
86
break
87
except:
88
print("Error")
89
self.sock.close()
90
break
91
client = Client(HOST, PORT)
92
93