原创 DeRoy 编程学习基地 2020-08-15

收录于话题

#QT项目实战

11个


点击蓝字 关注我们


基于Qt网络编程客户端

QTcpSocket

QTcpSocket 类提供一个TCP套接字TCP是一个面向连接,可靠的的通信协议,非常适合于连续不断的数据传递

QTcpSocket 是QAbstractSocket类非常方便的一个子类,让你创建一个TCP连接和数据流交流。

QTcpSocket 信号:

readyRead()	//有数据发送过来时触发该信号
disconnected() //socket->close()触发disconnected()信号,客户端服务端都触发

配置

pro文件添加

QT += network

Public

connectToHost()

连接服务器,参数为服务器地址和端口号

waitForConnected

设置等待连接,设置超时时间

QString ipAddressStr = ui->lineEditAddress->text();
quint16 port = ui->lineEditPort->text().toInt();
socket->connectToHost(ipAddressStr, port);
if(socket->waitForConnected(3000))
{
//连接成功
qDebug() << "connect secess";
}
else
{
   qDebug() << socket->errorString();
   return;
}

SIGNAL

disconnected()

Socket close信号,当socket执行close函数之后出发信号

connect(socket, SIGNAL(disconnected()),this,SLOT(disconnectedSlot()));//客户端断开连接

readyRead()

当服务端有数据发送过来的时候触发该信号

connect(socket, SIGNAL(readyRead()),this, SLOT(readyReadSlot())); //接收消息
QByteArray dataBa = socket->readAll();

UI设计

客户端UI设计TcpClient项目训练

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpSocket>
#include <QMessageBox>
#include <QDateTime>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
   Q_OBJECT

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

private slots:
   void on_pushButtonConnect_clicked();
   void disconnectedSlot();
   void readyReadSlot();
   void on_pushButtonSend_clicked();

private:
   Ui::Widget *ui;
   QTcpSocket *socket;
   bool socketState;
};
#endif // WIDGET_H

widget.cpp

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

Widget::Widget(QWidget *parent) :
   QWidget(parent),
   ui(new Ui::Widget)
{
   ui->setupUi(this);

   socket = new QTcpSocket;
   socketState = false;

   connect(socket, SIGNAL(disconnected()),this, SLOT(disconnectedSlot()));     //客户端断开连接
   connect(socket, SIGNAL(readyRead()),this, SLOT(readyReadSlot()));           //接收消息
}

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

void Widget::on_pushButtonConnect_clicked()
{
   QString ipAddressStr = ui->lineEditAddress->text();
   quint16 port = ui->lineEditPort->text().toInt();

   if(!socketState)
   {
       socket->connectToHost(ipAddressStr, port);
       if(socket->waitForConnected(3000))
       {
           qDebug() << "Connect2Server OK";
           ui->pushButtonConnect->setText("断开连接");
           socketState = true;
       }
       else
       {
           qDebug() << socket->errorString();
           return;
       }
   }
   else
   {
       socket->close();
       ui->pushButtonConnect->setText("连接");
       socketState = false;
   }
}

void Widget::disconnectedSlot()
{
   qDebug()<<"Socket close";
}

void Widget::readyReadSlot()
{
   QByteArray dataBa = socket->readAll();

   QString str = QString(QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss ddd")) +
           ":Recv\n" + str.fromLocal8Bit(dataBa.data());    //本地GBK转Unicode 解决乱码
   ui->textBrowserRecv->append(QString(str));          //送显示
}

void Widget::on_pushButtonSend_clicked()
{
   QString dataStr = ui->textEditSend->toPlainText();
   //QByteArray data = dataStr.toUtf8();        //发送UTF编码数据
   QByteArray data = dataStr.toLocal8Bit();     //发送本地字符(GBK)

   if(socket->isOpen() && socket->isValid())
   {
       socket->write(data);
   }

   QString str = QString(QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss ddd")) +
           ":Recv\n" + str.fromLocal8Bit(data.data());    //本地GBK转Unicode 解决乱码
   ui->textBrowserRecv->append(QString(str));          //送显示
}