Zeaks

Python lan chat client

Jul 7th, 2024 (edited)
312
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.66 KB | Software | 0 0
  1. import socket
  2. import threading
  3. import tkinter
  4.  
  5. class ChatClient:
  6.     def __init__(self):
  7.         self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  8.         self.client_socket.connect(('127.0.0.1', 5555))  # Change '127.0.0.1' to the server's IP if needed
  9.  
  10.         self.gui_done = False
  11.         self.running = True
  12.         self.username = self.get_internal_ip()
  13.  
  14.         gui_thread = threading.Thread(target=self.gui_loop)
  15.         receive_thread = threading.Thread(target=self.receive)
  16.  
  17.         gui_thread.start()
  18.         receive_thread.start()
  19.  
  20.     def get_internal_ip(self):
  21.         return socket.gethostbyname(socket.gethostname())
  22.  
  23.     def gui_loop(self):
  24.         self.root = tkinter.Tk()
  25.         self.root.configure(bg="lightgray")
  26.  
  27.         self.chat_label = tkinter.Label(self.root, text="Chat:", bg="lightgray")
  28.         self.chat_label.config(font=("Arial", 12))
  29.         self.chat_label.pack(padx=20, pady=5)
  30.  
  31.         self.text_area = tkinter.Text(self.root)
  32.         self.text_area.pack(padx=20, pady=5)
  33.         self.text_area.config(state='disabled')
  34.  
  35.         self.msg_label = tkinter.Label(self.root, text="Message:", bg="lightgray")
  36.         self.msg_label.config(font=("Arial", 12))
  37.         self.msg_label.pack(padx=20, pady=5)
  38.  
  39.         self.input_area = tkinter.Text(self.root, height=3)
  40.         self.input_area.pack(padx=20, pady=5)
  41.  
  42.         self.send_button = tkinter.Button(self.root, text="Send", command=self.write)
  43.         self.send_button.config(font=("Arial", 12))
  44.         self.send_button.pack(padx=20, pady=5)
  45.  
  46.         self.gui_done = True
  47.  
  48.         self.root.protocol("WM_DELETE_WINDOW", self.stop)
  49.         self.root.mainloop()
  50.  
  51.     def write(self):
  52.         message = f"{self.username}: {self.input_area.get('1.0', 'end')}"
  53.         self.client_socket.send(message.encode('utf-8'))
  54.         self.input_area.delete('1.0', 'end')
  55.  
  56.     def stop(self):
  57.         self.running = False
  58.         self.root.destroy()
  59.         self.client_socket.close()
  60.         exit(0)
  61.  
  62.     def receive(self):
  63.         while self.running:
  64.             try:
  65.                 message = self.client_socket.recv(1024).decode('utf-8')
  66.                 if self.gui_done:
  67.                     self.text_area.config(state='normal')
  68.                     self.text_area.insert('end', message + '\n')
  69.                     self.text_area.yview('end')
  70.                     self.text_area.config(state='disabled')
  71.             except ConnectionAbortedError:
  72.                 break
  73.             except:
  74.                 print("An error occurred.")
  75.                 self.client_socket.close()
  76.                 break
  77.  
  78. if __name__ == "__main__":
  79.     client = ChatClient()
  80.  
Advertisement
Add Comment
Please, Sign In to add comment