Загрузка...

C++ Python Chat IP:PORT C++ server + Python GUI

Тема в разделе Ваши работы создана пользователем rasez 24 июн 2025. (поднята 13 июл 2025) 249 просмотров

  1. rasez
    rasez Автор темы 24 июн 2025 Стим аккаунты тут - lolz.live/threads/7680775 :da: 1487 29 апр 2025
    Всем приветик
    Вот лолзик ожил после своей почти часовой смерти в темах :da:
    Сидел опять занимался ерундой и узнал что оказывается не нужно трахать мозг и писать
    интерфейс на с++ а можно писать на нем все что хочешь :finger_up:
    но реализовывать через пайтон тк это легче в 5 раз AGAAA :sigma:
    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())
    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;
    }
    [IMG]
    Кто захочет исправит в консоли вывод русских символов, также программа полноценно работает на вашем айпи адресе так что с кентом можно переписыватся хоть из африки, только откройте порты!!!!
    Также есть кфг который сохраняет ваш ник и адресс:порт


     
    24 июн 2025 Изменено
  2. krisssss
    krisssss 26 июн 2025 Заблокирован(а) 10 787 24 дек 2024
    ты написал IRC https://en.wikipedia.org/wiki/IRC , нужно задуматься над шифрованием чтобы на клиенте только расшифровывались
     
    1. rasez Автор темы
      krisssss, ну надо ток я пока что кекище ебаное
  3. thetruth
    на ноджс напиши ELECTRON интерфейс там интерфейс красивы можно
     
    1. rasez Автор темы
      thetruth, нихуя себе ничего не понял
    2. rasez Автор темы
      27 июн 2025 Изменено
    3. Посмотреть следующие комментарии (4)
  4. krisssss
    krisssss 29 июн 2025 Заблокирован(а) 10 787 24 дек 2024
    [IMG]немного улучшил ваш клиент и переписал сервер на golang
     
    1. rasez Автор темы
      krisssss, ничоси ты сделал пушку бомбу
Загрузка...
Top