Untitled

mail@pastecode.io avatarunknown
plain_text
12 days ago
3.4 kB
2
Indexable
Never
import socket
import tkinter as tk
import threading
from tkinter import messagebox

HOST = '0.0.0.0'
PORT = 65432

class ChatServerGUI:
    def __init__(self, master):
        self.master = master
        self.master.title("Chat Application")

        # Entry to set an alias for the user
        self.alias_label = tk.Label(self.master, text="Your Alias:")
        self.alias_label.pack(pady=5, padx=10)
        self.alias_entry = tk.Entry(self.master)
        self.alias_entry.pack(pady=5, padx=20, fill=tk.X)

        self.messages_frame = tk.Frame(self.master)
        self.scrollbar = tk.Scrollbar(self.messages_frame)
        
        # Listbox to display incoming and outgoing messages
        self.msg_list = tk.Listbox(self.messages_frame, height=20, width=50, yscrollcommand=self.scrollbar.set)
        self.scrollbar.pack(side=tk.RIGHT, fill=tk.BOTH)
        self.msg_list.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
        self.messages_frame.pack(pady=10, padx=10)

        # Input fields for the target IP and the message content
        self.target_ip_label = tk.Label(self.master, text="Send to IP:")
        self.target_ip_label.pack(pady=5, padx=10)
        self.target_ip_entry = tk.Entry(self.master)
        self.target_ip_entry.pack(pady=5, padx=20, fill=tk.X)

        self.message_label = tk.Label(self.master, text="Message:")
        self.message_label.pack(pady=5, padx=10)
        self.message_entry = tk.Entry(self.master)
        self.message_entry.pack(pady=5, padx=20, fill=tk.X)

        # Send button to transmit the message
        self.send_button = tk.Button(self.master, text="Send", command=self.send_message)
        self.send_button.pack(pady=10)

        # Start the server thread
        self.start_server_thread = threading.Thread(target=self.start_server)
        self.start_server_thread.start()

    def start_server(self):
        """Starts the UDP server to listen for incoming messages."""
        with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
            s.bind((HOST, PORT))
            while True:
                data, addr = s.recvfrom(1024)
                # The format of incoming data will be 'alias:message'
                alias, message = data.decode().split(':', 1)
                display_message = f"{alias}: {message}"
                self.msg_list.insert(tk.END, display_message)

    def send_message(self):
        """Sends the message to the specified IP."""
        target_ip = self.target_ip_entry.get().strip()
        message = self.message_entry.get().strip()
        alias = self.alias_entry.get().strip()

        # Ensure the necessary fields are filled
        if not target_ip or not message or not alias:
            messagebox.showerror("Error", "IP, alias, and message fields should be filled!")
            return

        # Append the alias to the message before sending
        full_message = f"{alias}:{message}"

        try:
            with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
                s.sendto(full_message.encode(), (target_ip, PORT))
            display_message = f"You ({alias}) to {target_ip}: {message}"
            self.msg_list.insert(tk.END, display_message)
        except Exception as e:
            messagebox.showerror("Error", f"Failed to send the message: {e}")

if __name__ == "__main__":
    root = tk.Tk()
    gui = ChatServerGUI(root)
    root.mainloop()