From ff9639fdfe3ff7cd8fa0219088a4b1f328168c78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=96thanhbinh0710?= Date: Fri, 18 Apr 2025 22:59:08 +0700 Subject: [PATCH] Update code --- GUI.py | 139 +++++++++++++++++ __pycache__/login.cpython-313.pyc | Bin 0 -> 1576 bytes __pycache__/p2p.cpython-313.pyc | Bin 0 -> 8346 bytes client.py | 29 ---- images/icon.png | Bin 0 -> 78585 bytes p2p.py | 238 ++++++++++++++++-------------- server.py | 51 ------- tracker.py | 35 +++-- 8 files changed, 285 insertions(+), 207 deletions(-) create mode 100644 GUI.py create mode 100644 __pycache__/login.cpython-313.pyc create mode 100644 __pycache__/p2p.cpython-313.pyc delete mode 100644 client.py create mode 100644 images/icon.png delete mode 100644 server.py diff --git a/GUI.py b/GUI.py new file mode 100644 index 0000000..fecbfcf --- /dev/null +++ b/GUI.py @@ -0,0 +1,139 @@ +import tkinter as tk +from tkinter import ttk +from datetime import datetime +from p2p import P2PNetwork +import socket + +class ChatUI: + def __init__(self, root): + self.root = root + self.root.title("P2P Segment Chat") + self.root.geometry("800x500") + + self.channel_messages = {} + self.current_channel = "General" + + self.create_channel_list() + self.create_message_display() + self.create_message_input() + self.create_status_bar() + + self.load_channel(self.current_channel) + + self.p2p = P2PNetwork(server_port=5557,on_message_callback=self.receive_message) + self.p2p.start_network() + self.p2p.get_peer_list_from_tracker() + pass + + def create_channel_list(self): + channel_frame = ttk.Frame(self.root, width=200) + channel_frame.pack(side=tk.LEFT, fill=tk.Y) + + ttk.Label(channel_frame, text="Danh sách kênh", font=('Arial', 12, 'bold')).pack(pady=5) + self.channel_list = tk.Listbox(channel_frame) + self.channel_list.pack(fill=tk.BOTH, expand=True, padx=5) + + channels = ["General", "Random", "Project"] + for ch in channels: + self.channel_list.insert(tk.END, ch) + self.channel_messages[ch] = [] + + self.channel_list.bind("<>", self.on_channel_select) + + def create_message_display(self): + msg_frame = ttk.Frame(self.root) + msg_frame.pack(side=tk.TOP, fill=tk.BOTH, expand=True) + + self.message_display = tk.Text(msg_frame, state=tk.DISABLED, wrap=tk.WORD) + self.message_display.pack(fill=tk.BOTH, expand=True, padx=5, pady=5) + + def create_message_input(self): + input_frame = ttk.Frame(self.root) + input_frame.pack(side=tk.BOTTOM, fill=tk.X, pady=5) + + self.message_entry = ttk.Entry(input_frame) + self.message_entry.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=(10, 5)) + ttk.Button(input_frame, text="Send", command=self.send_message).pack(side=tk.RIGHT, padx=(5, 10)) + + def create_status_bar(self): + self.status_var = tk.StringVar() + self.status_var.set("Trạng thái: Online") + + status_bar = ttk.Label(self.root, textvariable=self.status_var, anchor="w", relief=tk.SUNKEN) + status_bar.pack(side=tk.BOTTOM, fill=tk.X) + + def send_message(self): + msg = self.message_entry.get() + if msg: + timestamp = datetime.now().strftime("%H:%M:%S") + full_msg = f"[{timestamp}] You: {msg}" + self.channel_messages[self.current_channel].append(full_msg) + self.update_display() + self.message_entry.delete(0, tk.END) + for ip, port in self.p2p.connected_peers: + try: + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.connect((ip, port)) + data_to_send = f"{self.current_channel}||{msg}" + self.p2p.send(data_to_send, sock) + sock.close() + except Exception as e: + print(f"[ERROR] Could not send to {(ip, port)}: {e}") + + def receive_message(self, msg): + try: + channel, real_msg = msg.split("||", 1) + except ValueError: + channel, real_msg = "General", msg # fallback nếu định dạng cũ + + timestamp = datetime.now().strftime("%H:%M:%S") + full_msg = f"[{timestamp}] Peer: {real_msg}" + + # Lưu tin nhắn theo kênh + if channel not in self.channel_messages: + self.channel_messages[channel] = [] + + self.channel_messages[channel].append(full_msg) + + # Nếu đang ở đúng kênh thì hiển thị ngay + if channel == self.current_channel: + self.root.after(0, self.update_display) + + + def _append_message(self, msg): + self.channel_messages[self.current_channel].append(msg) + self.update_display() + + def update_display(self): + self.message_display.config(state=tk.NORMAL) + self.message_display.delete("1.0", tk.END) + + for msg in self.channel_messages[self.current_channel]: + self.message_display.insert(tk.END, msg + "\n") + + self.message_display.config(state=tk.DISABLED) + self.message_display.see(tk.END) + + def display_message(self, msg): + self.message_display.config(state=tk.NORMAL) + self.message_display.insert(tk.END, msg + "\n") + self.message_display.config(state=tk.DISABLED) + self.message_display.see(tk.END) + + def on_channel_select(self, event): + selection = self.channel_list.curselection() + if selection: + selected_channel = self.channel_list.get(selection[0]) + if selected_channel != self.current_channel: + self.load_channel(selected_channel) + + def load_channel(self, channel): + self.current_channel = channel + self.status_var.set(f"Currently at channel: {channel}") + self.update_display() + + +if __name__ == "__main__": + root = tk.Tk() + app = ChatUI(root) + root.mainloop() diff --git a/__pycache__/login.cpython-313.pyc b/__pycache__/login.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c38daa3e63ca2ce16e7a1caf471937e0199b11ea GIT binary patch literal 1576 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%0AM)ntUk8gQPYSRYPqU^kjh0+!fWFofK8ZD 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 Mo!lI&?SoJJ3FqCy5dZ)H literal 0 HcmV?d00001 diff --git a/p2p.py b/p2p.py index 1055e0f..3158efd 100644 --- a/p2p.py +++ b/p2p.py @@ -1,128 +1,144 @@ import socket import threading import time +import json # Thêm import này HEADER = 64 FORMAT = "utf-8" DISCONNECT_MESSAGE = "!DISCONNECT" -TRACKER_HOST = "10.128.242.7" # Localhost for testing +TRACKER_HOST = "192.168.1.102" # Sửa theo IP máy tracker TRACKER_PORT = 5555 -# Ask user which port to use for their server -server_port = int(input("Enter your server port (e.g., 5555): ")) -PEER_HOST = socket.gethostbyname(socket.gethostname()) -ADDR = (PEER_HOST, server_port) - -connected_peers = [] - - -def send(msg, sock): - message = msg.encode(FORMAT) - msg_length = len(message) - send_length = str(msg_length).encode(FORMAT) - send_length += b" " * (HEADER - len(send_length)) - sock.send(send_length) - sock.send(message) - - -# --- REGISTER (TRACKER)--- -def register_with_tracker(): - client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - client.connect((TRACKER_HOST, TRACKER_PORT)) - - send(f"submit_info {PEER_HOST} {server_port}", client) - print("[REGISTERED] Peer info submitted to tracker.") - - msg_length = client.recv(HEADER).decode(FORMAT) - if msg_length: - msg_length = int(msg_length) - msg = client.recv(msg_length).decode(FORMAT) - print(f"[RECEIVED] Tracker response: {msg}") - time.sleep(2) - - client.close() - - -# --- GET (TRACKER)--- -def get_peer_list_from_tracker(): - global connected_peers - client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - client.connect((TRACKER_HOST, TRACKER_PORT)) - - send("get_list", client) - print("[REQUEST] Peer list requested from tracker.") - - msg_length = client.recv(HEADER).decode(FORMAT) - if msg_length: - msg_length = int(msg_length) - msg = client.recv(msg_length).decode(FORMAT) - print(f"[RECEIVED] Peer list: {msg}") +def get_local_ip(): + import socket + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + try: + # Kết nối ảo để xác định IP nội mạng + s.connect(("8.8.8.8", 80)) + ip = s.getsockname()[0] + except Exception: + ip = "127.0.0.1" + finally: + s.close() + return ip + + +class P2PNetwork: + def __init__(self, server_port, on_message_callback=None): + self.server_port = server_port + self.PEER_HOST = get_local_ip() + print(f"[DEBUG] My IP: {self.PEER_HOST}") + + self.ADDR = (self.PEER_HOST, self.server_port) + self.connected_peers = [] + self.on_message_callback = on_message_callback + + + def send(self, msg, sock): + message = msg.encode(FORMAT) + msg_length = len(message) + send_length = str(msg_length).encode(FORMAT) + send_length += b" " * (HEADER - len(send_length)) + sock.send(send_length) + sock.send(message) + + def register_with_tracker(self): + client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + client.connect((TRACKER_HOST, TRACKER_PORT)) + self.send(f"submit_info {self.PEER_HOST} {self.server_port}", client) + print("[REGISTERED] Peer info submitted to tracker.") + + msg_length = client.recv(HEADER).decode(FORMAT) + if msg_length: + msg_length = int(msg_length) + msg = client.recv(msg_length).decode(FORMAT) + print(f"[RECEIVED] Tracker response: {msg}") + time.sleep(1) + client.close() - client.close() + def get_peer_list_from_tracker(self): + client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + client.connect((TRACKER_HOST, TRACKER_PORT)) + self.send("get_list", client) + print("[REQUEST] Peer list requested from tracker.") -# --- Server Part --- -def handle_peer(conn, addr): - print(f"[INCOMING] Connection from {addr}") - connected = True - while connected: - msg_length = conn.recv(HEADER).decode(FORMAT) + msg_length = client.recv(HEADER).decode(FORMAT) if msg_length: msg_length = int(msg_length) - msg = conn.recv(msg_length).decode(FORMAT) - - if msg == DISCONNECT_MESSAGE: + msg = client.recv(msg_length).decode(FORMAT) + print(f"[RECEIVED] Peer list raw: {msg}") + + try: + peer_data = json.loads(msg) + self.connected_peers = [tuple(p) for p in peer_data if tuple(p) != self.ADDR] + print(f"[PEERS] Updated peer list: {self.connected_peers}") + except Exception as e: + print(f"[ERROR] Failed to parse peer list: {e}") + + client.close() + + def handle_peer(self, conn, addr): + print(f"[INCOMING] Connection from {addr}") + connected = True + while connected: + try: + msg_length = conn.recv(HEADER).decode(FORMAT) + if msg_length: + msg_length = int(msg_length) + msg = conn.recv(msg_length).decode(FORMAT) + + if msg == DISCONNECT_MESSAGE: + connected = False + print(f"[DISCONNECTED] {addr}") + break + + print(f"[{addr}] {msg}") + + # GỌI CALLBACK VỀ GUI TẠI ĐÂY + if self.on_message_callback: + self.on_message_callback(msg) + + + except Exception as e: + print(f"[ERROR] Error handling peer {addr}: {e}") connected = False + conn.close() + + + def start_server(self): + server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + server.bind(self.ADDR) + server.listen() + print(f"[LISTENING] Peer listening on {self.PEER_HOST}:{self.server_port}") + + while True: + conn, addr = server.accept() + thread = threading.Thread(target=self.handle_peer, args=(conn, addr), daemon=True) + thread.start() + + def start_network(self): + self.register_with_tracker() + server_thread = threading.Thread(target=self.start_server, daemon=True) + server_thread.start() + + def manual_connect(self): + target_ip = input("Enter IP of peer to connect to: ") + target_port = int(input("Enter port of peer to connect to: ")) + client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + client.connect((target_ip, target_port)) + + print("[CONNECTED] Type messages to send. Type '!DISCONNECT' to end.") + while True: + msg = input("> ") + self.send(msg, client) + if msg == DISCONNECT_MESSAGE: + break + elif msg == "get_list": + self.get_peer_list_from_tracker() + elif msg == "add_list": + self.register_with_tracker() - print(f"[{addr}] {msg}") - - conn.close() - print(f"[DISCONNECTED] {addr}") - - -def start_server(): - server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - server.bind(ADDR) - server.listen() - print(f"[LISTENING] Peer listening on {PEER_HOST}:{server_port}") - - while True: - conn, addr = server.accept() - thread = threading.Thread(target=handle_peer, args=(conn, addr)) - thread.start() - - -# --- Client Part --- -def send_to_peer(): - target_ip = input("Enter IP of peer to connect to: ") - target_port = int(input("Enter port of peer to connect to: ")) - client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - client.connect((target_ip, target_port)) - - print("[CONNECTED] Type messages to send. Type '!DISCONNECT' to end.") - while True: - msg = input("> ") - send(msg, client) - if msg == DISCONNECT_MESSAGE: - break - elif msg == "get_list": - get_peer_list_from_tracker() - elif msg == "add_list": - register_with_tracker() - - client.close() - - -# --- Main --- -if __name__ == "__main__": - print("[STARTING] Peer is starting...") - register_with_tracker() - - # Start server thread - server_thread = threading.Thread(target=start_server) - server_thread.start() - - # Connect to another peer - client_thread = threading.Thread(target=send_to_peer) - client_thread.start() + client.close() diff --git a/server.py b/server.py deleted file mode 100644 index 9693473..0000000 --- a/server.py +++ /dev/null @@ -1,51 +0,0 @@ -import socket -import threading - -HEADER = 64 -FORMAT = "utf-8" -PORT = 5555 -SERVER = socket.gethostbyname(socket.gethostname()) -ADDR = (SERVER, PORT) -DISCONNECT_MESSAGE = "!DISCONNECT" - -server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) -server.bind(ADDR) - -print(socket.gethostname()) -print(SERVER) - - -def handle_client(conn, addr): - print(f"New connection: {addr} connected.") - - connected = True - - while connected: - msg_length = conn.recv(HEADER).decode(FORMAT) - if msg_length: - msg_length = int(msg_length) - msg = conn.recv(msg_length).decode(FORMAT) - - if msg == DISCONNECT_MESSAGE: - connected = False - - print(f"Message from {addr}: {msg}") - - conn.close() - print(f"Connection closed: {addr}") - - -def start(): - server.listen() - print(f"Server is listening on {SERVER}:{PORT}") - - while True: - conn, addr = server.accept() - print(f"New connection: [{addr}]") - thread = threading.Thread(target=handle_client, args=(conn, addr)) - thread.start() - print(f"Active connections: {threading.active_count() - 1}") - - -print("Server is starting...") -start() diff --git a/tracker.py b/tracker.py index f29d7c1..c59929c 100644 --- a/tracker.py +++ b/tracker.py @@ -1,6 +1,7 @@ import socket import threading import argparse +import json # Thêm import này peer_list = [] peer_list_lock = threading.Lock() @@ -36,22 +37,22 @@ def handle_client(addr, conn): print(f"Message from {addr}: {msg}") parts = msg.split() - if parts[0] == "submit_info" and len(parts) == 3: - ip = parts[1] - port = int(parts[2]) - with peer_list_lock: - peer = (ip, port) - if peer not in peer_list: - peer_list.append((ip, port)) - print(f"Peer list updated: {peer_list}") - send(f"Peer {ip}:{port} added to list.", conn) - else: - send(f"Peer {ip}:{port} already in list.", conn) - - elif parts[0] == "get_list": - with peer_list_lock: - print(f"Send Peer list to: {addr}") - send(f"Peer list: {peer_list}", conn) + if parts[0] == "submit_info" and len(parts) == 3: + ip = parts[1] + port = int(parts[2]) + with peer_list_lock: + peer = (ip, port) + if peer not in peer_list: + peer_list.append(peer) + print(f"Peer list updated: {peer_list}") + send(f"Peer {ip}:{port} added to list.", conn) + else: + send(f"Peer {ip}:{port} already in list.", conn) + + elif parts[0] == "get_list": + with peer_list_lock: + print(f"Send Peer list to: {addr}") + send(json.dumps(peer_list), conn) except Exception as e: print(f"Error handling message from {addr}: {e}") @@ -70,6 +71,8 @@ def send(msg, conn): def start(host, port): server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + server.bind((host, port)) server.listen() print(f"Tracker is running on {SERVER}:{PORT}")