/
rechel901
/
server-client
Обзор
Документация
Войти
/
rechel901
/
server-client
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
client/src/mainwindow.cpp
102 строки
3 KB
kashirskaya
инициализация репозитория
06 июн 2024, 20:05
06 июн 2024, 20:05
0f8b8a1
Код
Авторство
О чём код?
#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); m_socket = new QTcpSocket(this); m_nextMsgSize = 0; connect(m_socket, &QTcpSocket::readyRead, this, &MainWindow::slotReadyRead); connect(m_socket, &QTcpSocket::disconnectFromHost, m_socket, &QTcpSocket::deleteLater); connect(m_socket, &QTcpSocket::disconnected, this, &MainWindow::slot) } MainWindow::~MainWindow() { delete ui; } void MainWindow::slotReadyRead() { QDataStream in(m_socket); in.setVersion(QDataStream::Qt_5_12); qDebug() << "MainWindow::slotReadyRead()" << m_socket << "in.status()" << in.status(); if(in.status() == QDataStream::Ok){ // Точно не известно придут данные по частям или целиком // for(;;){ // чтение размера блока сообщения if(m_nextMsgSize == 0){ // для чтения доступно не меньше 2 байт if(m_socket->bytesAvailable() < 2){ break; } in >> m_nextMsgSize; qDebug() << "m_nextMsgSize = " << m_nextMsgSize; } if(m_socket->bytesAvailable() < m_nextMsgSize){ break; } QString str; in >> str; ui->textEdit->insertPlainText(str); m_nextMsgSize = 0; // для считывания нового сообщения qDebug() << "str" << str << "m_nextMsgSize" << m_nextMsgSize; } } else { ui->textEdit->insertPlainText("read error"); } } void MainWindow::on_pushButton_clicked() { if(ui->pushButton->text() == "Connect"){ ui->pushButton->setText("Disconnect"); m_socket->connectToHost("127.0.0.1", 2323); } else { ui->pushButton->setText("Connect"); ui->textEdit->append("disconnect"); m_socket->disconnectFromHost(); } qDebug() << "MainWindow::on_pushButton_clicked() m_socket" << m_socket; } void MainWindow::sendToServer(QString msg) { m_data.clear(); QDataStream out(&m_data, QIODevice::WriteOnly); out.setVersion(QDataStream::Qt_5_12); // запись сообщения в формате "размер передаваемого сообщения" (2 байта) // и "сообщение" для передачи на сервер (все остальные байты) out << quint16(0) << msg; qDebug() << "Client::sendToServer() m_data.size()" << m_data.size(); out.device()->seek(0); // переходим в начала сообщения для записи его реального размера out << quint16(m_data.size() - sizeof(quint16)); // записать в первые два байта сообщения // реальный размер сообщения m_data.size(), вычесть первые два байта с размером сообщения qDebug() << "Client::sendToServer() m_data.size()" << m_data.size() << msg; m_socket->write(m_data); ui->lineEdit->clear(); } void MainWindow::on_pushButton_2_clicked() { sendToServer(ui->lineEdit->text()); } void MainWindow::on_lineEdit_returnPressed() { sendToServer(ui->lineEdit->text()); }