Всем приветик Вот лолзик ожил после своей почти часовой смерти в темах Сидел опять занимался ерундой и узнал что оказывается не нужно трахать мозг и писать интерфейс на с++ а можно писать на нем все что хочешь но реализовывать через пайтон тк это легче в 5 раз AGAAA Кодик всего этого ужаса Python GUI import sys import json from PyQt6.QtWidgets import ( QApplication, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QTextEdit, QLineEdit, QLabel ) from PyQt6.QtCore import Qt, QThread, pyqtSignal import socket CONFIG_FILE = "chat_config.json" class ReceiverThread(QThread): message_received = pyqtSignal(str) def __init__(self, sock): super().__init__() self.sock = sock self.running = True def run(self): while self.running: try: data = self.sock.recv(1024) if not data: break msg = data.decode('utf-8').strip() self.message_received.emit(msg) except Exception: break def stop(self): self.running = False self.sock.close() self.wait() class ChatClient(QWidget): def __init__(self): super().__init__() self.setWindowTitle("Простой чат") self.sock = None self.receiver_thread = None self.load_config() self.layout = QVBoxLayout() self.setLayout(self.layout) # Имя пользователя self.name_label = QLabel("Ваше имя:") self.name_input = QLineEdit() self.name_input.setText(self.username) self.name_input.editingFinished.connect(self.save_config) # Адрес сервера self.addr_label = QLabel("Адрес сервера (IP:порт):") self.addr_input = QLineEdit() self.addr_input.setText(self.server_addr) # Кнопка подключения self.connect_button = QPushButton("Подключиться") self.connect_button.clicked.connect(self.connect_to_server) # Окно сообщений self.chat_display = QTextEdit() self.chat_display.setReadOnly(True) # Поле ввода сообщения и кнопка отправки self.message_input = QLineEdit() self.message_input.returnPressed.connect(self.send_message) self.send_button = QPushButton("Отправить") self.send_button.clicked.connect(self.send_message) # Расположение элементов top_layout = QHBoxLayout() top_layout.addWidget(self.name_label) top_layout.addWidget(self.name_input) top_layout.addWidget(self.addr_label) top_layout.addWidget(self.addr_input) top_layout.addWidget(self.connect_button) bottom_layout = QHBoxLayout() bottom_layout.addWidget(self.message_input) bottom_layout.addWidget(self.send_button) self.layout.addLayout(top_layout) self.layout.addWidget(self.chat_display) self.layout.addLayout(bottom_layout) def load_config(self): try: with open(CONFIG_FILE, 'r', encoding='utf-8') as f: config = json.load(f) self.username = config.get("username", "Anon") self.server_addr = config.get("server_addr", "127.0.0.1:12345") except: self.username = "Anon" self.server_addr = "127.0.0.1:12345" def save_config(self): self.username = self.name_input.text() config = { "username": self.username, "server_addr": self.addr_input.text() } with open(CONFIG_FILE, 'w', encoding='utf-8') as f: json.dump(config, f) def connect_to_server(self): if self.sock: self.sock.close() addr = self.addr_input.text() try: ip, port = addr.split(":") port = int(port) self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.connect((ip, port)) self.chat_display.append("Подключено к серверу.") self.save_config() self.receiver_thread = ReceiverThread(self.sock) self.receiver_thread.message_received.connect(self.display_message) self.receiver_thread.start() except Exception as e: self.chat_display.append(f"Ошибка подключения: {e}") def send_message(self): if not self.sock: self.chat_display.append("Вы не подключены к серверу.") return msg = self.message_input.text().strip() if msg == "": return full_msg = f"{self.username}: {msg}" try: self.sock.sendall((full_msg + "\n").encode('utf-8')) self.message_input.clear() except Exception as e: self.chat_display.append(f"Ошибка отправки: {e}") def display_message(self, msg): self.chat_display.append(msg) def closeEvent(self, event): if self.receiver_thread: self.receiver_thread.stop() if self.sock: self.sock.close() event.accept() if __name__ == "__main__": app = QApplication(sys.argv) window = ChatClient() window.show() sys.exit(app.exec()) Python import sys import json from PyQt6.QtWidgets import ( QApplication, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QTextEdit, QLineEdit, QLabel ) from PyQt6.QtCore import Qt, QThread, pyqtSignal import socket CONFIG_FILE = "chat_config.json" class ReceiverThread(QThread): message_received = pyqtSignal(str) def __init__(self, sock): super().__init__() self.sock = sock self.running = True def run(self): while self.running: try: data = self.sock.recv(1024) if not data: break msg = data.decode('utf-8').strip() self.message_received.emit(msg) except Exception: break def stop(self): self.running = False self.sock.close() self.wait() class ChatClient(QWidget): def __init__(self): super().__init__() self.setWindowTitle("Простой чат") self.sock = None self.receiver_thread = None self.load_config() self.layout = QVBoxLayout() self.setLayout(self.layout) # Имя пользователя self.name_label = QLabel("Ваше имя:") self.name_input = QLineEdit() self.name_input.setText(self.username) self.name_input.editingFinished.connect(self.save_config) # Адрес сервера self.addr_label = QLabel("Адрес сервера (IP:порт):") self.addr_input = QLineEdit() self.addr_input.setText(self.server_addr) # Кнопка подключения self.connect_button = QPushButton("Подключиться") self.connect_button.clicked.connect(self.connect_to_server) # Окно сообщений self.chat_display = QTextEdit() self.chat_display.setReadOnly(True) # Поле ввода сообщения и кнопка отправки self.message_input = QLineEdit() self.message_input.returnPressed.connect(self.send_message) self.send_button = QPushButton("Отправить") self.send_button.clicked.connect(self.send_message) # Расположение элементов top_layout = QHBoxLayout() top_layout.addWidget(self.name_label) top_layout.addWidget(self.name_input) top_layout.addWidget(self.addr_label) top_layout.addWidget(self.addr_input) top_layout.addWidget(self.connect_button) bottom_layout = QHBoxLayout() bottom_layout.addWidget(self.message_input) bottom_layout.addWidget(self.send_button) self.layout.addLayout(top_layout) self.layout.addWidget(self.chat_display) self.layout.addLayout(bottom_layout) def load_config(self): try: with open(CONFIG_FILE, 'r', encoding='utf-8') as f: config = json.load(f) self.username = config.get("username", "Anon") self.server_addr = config.get("server_addr", "127.0.0.1:12345") except: self.username = "Anon" self.server_addr = "127.0.0.1:12345" def save_config(self): self.username = self.name_input.text() config = { "username": self.username, "server_addr": self.addr_input.text() } with open(CONFIG_FILE, 'w', encoding='utf-8') as f: json.dump(config, f) def connect_to_server(self): if self.sock: self.sock.close() addr = self.addr_input.text() try: ip, port = addr.split(":") port = int(port) self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.connect((ip, port)) self.chat_display.append("Подключено к серверу.") self.save_config() self.receiver_thread = ReceiverThread(self.sock) self.receiver_thread.message_received.connect(self.display_message) self.receiver_thread.start() except Exception as e: self.chat_display.append(f"Ошибка подключения: {e}") def send_message(self): if not self.sock: self.chat_display.append("Вы не подключены к серверу.") return msg = self.message_input.text().strip() if msg == "": return full_msg = f"{self.username}: {msg}" try: self.sock.sendall((full_msg + "\n").encode('utf-8')) self.message_input.clear() except Exception as e: self.chat_display.append(f"Ошибка отправки: {e}") def display_message(self, msg): self.chat_display.append(msg) def closeEvent(self, event): if self.receiver_thread: self.receiver_thread.stop() if self.sock: self.sock.close() event.accept() if __name__ == "__main__": app = QApplication(sys.argv) window = ChatClient() window.show() sys.exit(app.exec()) С++ Sever+Messages #include <boost/asio.hpp> #include <iostream> #include <thread> #include <set> #include <memory> #include <mutex> using boost::asio::ip::tcp; std::set<std::shared_ptr<tcp::socket>> clients; std::mutex clients_mutex; void broadcast(const std::string& message) { std::lock_guard<std::mutex> lock(clients_mutex); for (auto& sock : clients) { boost::asio::write(*sock, boost::asio::buffer(message + "\n")); } } void client_session(std::shared_ptr<tcp::socket> sock) { try { boost::asio::streambuf buf; while (true) { boost::asio::read_until(*sock, buf, "\n"); std::istream is(&buf); std::string line; std::getline(is, line); if(line.empty()) continue; std::cout << "Received: " << line << std::endl; broadcast(line); } } catch (std::exception& e) { std::cerr << "Client disconnected: " << e.what() << std::endl; std::lock_guard<std::mutex> lock(clients_mutex); clients.erase(sock); } } int main() { try { boost::asio::io_context io_context; tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), 12345)); std::cout << "Server started on port 12345\n"; while (true) { auto sock = std::make_shared<tcp::socket>(io_context); acceptor.accept(*sock); { std::lock_guard<std::mutex> lock(clients_mutex); clients.insert(sock); } std::thread(client_session, sock).detach(); std::cout << "New client connected\n"; } } catch (std::exception& e) { std::cerr << "Server error: " << e.what() << std::endl; } return 0; } C #include <boost/asio.hpp> #include <iostream> #include <thread> #include <set> #include <memory> #include <mutex> using boost::asio::ip::tcp; std::set<std::shared_ptr<tcp::socket>> clients; std::mutex clients_mutex; void broadcast(const std::string& message) { std::lock_guard<std::mutex> lock(clients_mutex); for (auto& sock : clients) { boost::asio::write(*sock, boost::asio::buffer(message + "\n")); } } void client_session(std::shared_ptr<tcp::socket> sock) { try { boost::asio::streambuf buf; while (true) { boost::asio::read_until(*sock, buf, "\n"); std::istream is(&buf); std::string line; std::getline(is, line); if(line.empty()) continue; std::cout << "Received: " << line << std::endl; broadcast(line); } } catch (std::exception& e) { std::cerr << "Client disconnected: " << e.what() << std::endl; std::lock_guard<std::mutex> lock(clients_mutex); clients.erase(sock); } } int main() { try { boost::asio::io_context io_context; tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), 12345)); std::cout << "Server started on port 12345\n"; while (true) { auto sock = std::make_shared<tcp::socket>(io_context); acceptor.accept(*sock); { std::lock_guard<std::mutex> lock(clients_mutex); clients.insert(sock); } std::thread(client_session, sock).detach(); std::cout << "New client connected\n"; } } catch (std::exception& e) { std::cerr << "Server error: " << e.what() << std::endl; } return 0; } Картиночки как это все выглядит Кто захочет исправит в консоли вывод русских символов, также программа полноценно работает на вашем айпи адресе так что с кентом можно переписыватся хоть из африки, только откройте порты!!!! Также есть кфг который сохраняет ваш ник и адресс:портGITHUB
ты написал IRC https://en.wikipedia.org/wiki/IRC , нужно задуматься над шифрованием чтобы на клиенте только расшифровывались
thetruth, бля ебать потная библиотека не я за js вообще не выкупаю, джпт просить не хочу это хуйня дл опущеных