Загрузка...

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

Thread in Your projects created by rasez Jun 24, 2025. (bumped Jul 13, 2025) 235 views

  1. rasez
    rasez Topic starter Jun 24, 2025 Стим аккаунты тут - lolz.live/threads/7680775 :da: 1481 Apr 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]
    Кто захочет исправит в консоли вывод русских символов, также программа полноценно работает на вашем айпи адресе так что с кентом можно переписыватся хоть из африки, только откройте порты!!!!
    Также есть кфг который сохраняет ваш ник и адресс:порт


     
  2. krisssss
    krisssss Jun 26, 2025 Banned 10,787 Dec 24, 2024
    ты написал IRC https://en.wikipedia.org/wiki/IRC , нужно задуматься над шифрованием чтобы на клиенте только расшифровывались
     
    1. rasez Topic starter
      krisssss, ну надо ток я пока что кекище ебаное
  3. thetruth
    на ноджс напиши ELECTRON интерфейс там интерфейс красивы можно
     
    1. View previous comments (4)
    2. rasez Topic starter
      thetruth, ниху это чо можно на Hmlt css js писать интерфейс для пайтона и с++?
    3. rasez Topic starter
      thetruth, бля ебать потная библиотека не я за js вообще не выкупаю, джпт просить не хочу это хуйня дл опущеных
  4. krisssss
    krisssss Jun 29, 2025 Banned 10,787 Dec 24, 2024
    [IMG]немного улучшил ваш клиент и переписал сервер на golang
     
    1. rasez Topic starter
      krisssss, ничоси ты сделал пушку бомбу
Loading...
Top