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>