Загрузка...

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

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

  1. rasez
    rasez Автор темы 24 июн 2025 Стим аккаунты тут - lolz.live/threads/7680775 :da: 1486 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. Посмотреть предыдущие комментарии (3)
    2. rasez Автор темы
      thetruth, я хочу се какой то крутой интерфейс сделать но могу ток на эой залупе и pyqt5
    3. rasez Автор темы
      thetruth, ниху это чо можно на Hmlt css js писать интерфейс для пайтона и с++?
    4. Посмотреть следующие комментарии (1)
  4. krisssss
    krisssss 29 июн 2025 Заблокирован(а) 10 787 24 дек 2024
    [IMG]немного улучшил ваш клиент и переписал сервер на golang
     
    1. rasez Автор темы
      krisssss, ничоси ты сделал пушку бомбу
Загрузка...
Top