16.Qt使用QTcpSocket实现网络助手客户端

Qt使用QTcpSocket实现网络助手客户端

.pro需要增加network

QT       += core gui network

headers

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QTcpSocket>
#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_btnConnect_clicked();
    void mRead_Data_From_server();
    void on_btnDisconnect_clicked();

    void on_btnSend_clicked();
    void onConnected();
    void onConnectError(QAbstractSocket::SocketError socketError);
    void onTimeOut();
private:
    Ui::Widget *ui;
    QTcpSocket *cliect;
    QTimer *timer;
    void setInsetColor(Qt::GlobalColor color, QString str);
};
#endif // WIDGET_H

sources

widget.cpp

#include "widget.h"
#include "ui_widget.h"

#include <QMessageBox>
#include <QTimer>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //布局自适应大小
    this->setLayout(ui->verticalLayout);

    cliect = new QTcpSocket(this);
    //建立连接读取数据的信号与槽
    connect(cliect,SIGNAL(readyRead()),this,SLOT(mRead_Data_From_server()));
    ui->btnDisconnect->setEnabled(true);

}

Widget::~Widget()
{
    delete ui;
}

//连接客户端
void Widget::on_btnConnect_clicked()
{
    cliect->connectToHost(ui->lineEditServerAddr->text(),
                          ui->lineEditServerPort->text().toInt());

    timer = new QTimer(this);
    timer->setSingleShot(true);
    timer->setInterval(5000);
    //建立连接超时的信号与槽
    connect(timer,SIGNAL(timeout()),this,SLOT(onTimeOut()));
    //建立连接成功的信号与槽
    connect(cliect,SIGNAL(connected()),this,SLOT(onConnected()));
    //建立连接异常的信号与槽
    connect(cliect,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(onConnectError(QAbstractSocket::SocketError)));
    this->setEnabled(false);
    timer->start();
}

//读取数据
void Widget::mRead_Data_From_server()
{
    setInsetColor(Qt::black,"服务端:"+cliect->readAll());
    //ui->textEditReceive->insertPlainText("服务端:"+cliect->readAll()+"\n");
    ui->textEditReceive->moveCursor(QTextCursor::End);
    ui->textEditReceive->ensureCursorVisible();
}

//断开连接
void Widget::on_btnDisconnect_clicked()
{
    cliect->close();

    if(cliect->state() == QAbstractSocket::ClosingState || cliect->state() == QAbstractSocket::UnconnectedState)
    {
        ui->textEditReceive->append("中止连接!");
        ui->btnConnect->setEnabled(true);
        ui->lineEditServerAddr->setEnabled(true);
        ui->lineEditServerPort->setEnabled(true);
        ui->btnDisconnect->setEnabled(false);
    }
}

//发送数据
void Widget::on_btnSend_clicked()
{
    QByteArray str = ui->textEditSendContext->toPlainText().toUtf8();
    cliect->write(str);
    setInsetColor(Qt::red,"客户端:"+ui->textEditSendContext->toPlainText());
    //ui->textEditReceive->append("客户端:"+str);
    //清空当前输入
    ui->textEditSendContext->clear();
}
//连接服务器
void Widget::onConnected()
{
    timer->stop();
    this->setEnabled(true);
    ui->textEditReceive->append("连接成功!\n");
    ui->btnConnect->setEnabled(false);
    ui->lineEditServerAddr->setEnabled(false);
    ui->lineEditServerPort->setEnabled(false);
    ui->btnDisconnect->setEnabled(true);
}

//连接异常
void Widget::onConnectError(QAbstractSocket::SocketError socketError)
{
    qDebug() << "连接错误:"<< socketError;
    ui->textEditReceive->insertPlainText("连接错误:"+ cliect->errorString()+"\n");
    this->setEnabled(true);
    on_btnDisconnect_clicked();
}

//超时提示
void Widget::onTimeOut()
{
//    QMessageBox msgBox;
//    msgBox.setWindowTitle("连接错误");
//    msgBox.setText("连接超时");
//    msgBox.exec();
    ui->textEditReceive->insertPlainText("连接超时\n");
    this->setEnabled(true);
    cliect->abort();
}

//设置当前颜色
void Widget::setInsetColor(Qt::GlobalColor color, QString str)
{
    QTextCursor cursor = ui->textEditReceive->textCursor();
    QTextCharFormat format;
    format.setForeground(QBrush(QColor(color)));
    cursor.setCharFormat(format);
    cursor.insertText(str+"\n");
}

UI

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Widget</class>
 <widget class="QWidget" name="Widget">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>578</width>
    <height>428</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>网络调试客户端</string>
  </property>
  <widget class="QWidget" name="layoutWidget">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>576</width>
     <height>425</height>
    </rect>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout" stretch="6,1,2">
    <property name="leftMargin">
     <number>5</number>
    </property>
    <property name="topMargin">
     <number>5</number>
    </property>
    <property name="rightMargin">
     <number>5</number>
    </property>
    <property name="bottomMargin">
     <number>5</number>
    </property>
    <item>
     <widget class="QTextEdit" name="textEditReceive"/>
    </item>
    <item>
     <layout class="QHBoxLayout" name="horizontalLayout_2">
      <item>
       <widget class="QLabel" name="label">
        <property name="text">
         <string>服务器IP:</string>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QLineEdit" name="lineEditServerAddr">
        <property name="text">
         <string>192.168.96.169</string>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QLabel" name="label_2">
        <property name="text">
         <string>服务器端口:</string>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QLineEdit" name="lineEditServerPort">
        <property name="text">
         <string>8888</string>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QPushButton" name="btnConnect">
        <property name="text">
         <string>连接</string>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QPushButton" name="btnDisconnect">
        <property name="text">
         <string>断开</string>
        </property>
       </widget>
      </item>
     </layout>
    </item>
    <item>
     <layout class="QHBoxLayout" name="horizontalLayout">
      <item>
       <widget class="QTextEdit" name="textEditSendContext"/>
      </item>
      <item>
       <widget class="QPushButton" name="btnSend">
        <property name="minimumSize">
         <size>
          <width>80</width>
          <height>80</height>
         </size>
        </property>
        <property name="text">
         <string>发送</string>
        </property>
       </widget>
      </item>
     </layout>
    </item>
   </layout>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>
posted @ 2025-05-09 12:03  站着说话不腰疼  阅读(64)  评论(0)    收藏  举报