《Qt开发》TCP编程之客户端程序

该博客介绍了如何在Qt环境中创建一个TCP客户端,详细阐述了新建项目、包含头文件、声明对象和槽函数的过程。在源文件中,通过设置样式表、连接服务器、处理连接状态变化、发送和接收数据等函数,实现了客户端与服务器之间的数据通信。同时,提供了选择并发送文本文件到服务器的功能。
摘要由CSDN通过智能技术生成

图1 显示界面

 

图2 网络助手辅助测试

 

1. 新建项目时要选择Network模块

2. 头文件中加入#include <QtNetwork>

声明QTcpSocket对象 QTcpSocket *tcpSocket;

声明如下函数和槽函数

void setQss();

public slots:

void currState();

void on_pBtnConn_clicked();

void on_pBtnSend_clicked();

void on_pBtnSel_clicked();

void on_pBtnSendTxt_clicked();

void recvMessage();  //接收数据

3. 在源文件构造函数中添加如下代码

setQss();

ui.lineEditIP->setText("192.168.57.138");

ui.lineEditPort->setText("7588");

tcpSocket = new QTcpSocket(this);

connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(recvMessage()));

connect(tcpSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(currState()));

//源文件中其他函数

void Client::setQss()

{

//读取样式表设置样式

QString strStyleSheet = "";

QFile file("Config/StyleSheet.qss");

file.open(QFile::ReadOnly);

if (file.isOpen())

{

strStyleSheet = QLatin1String(file.readAll());

}

this->setStyleSheet(strStyleSheet);

//遍历同类控件,设置样式

//QString str1 = "QWidget{background-color:qlineargradient(spread:pad, x1:0,y1:0,x2:0,y2:1, stop:0.1 rgb(107,128,169),stop:1 rgb(1,71,133))}";

//QString str2 = "background-color: rgb(236,220,171)";

//QString str3 = "background-color:rgb(255,255,255)";

//this->setStyleSheet(str1);

//ui.plainTextEdit->setStyleSheet(str3);

//QList<QPushButton *> allpBtns = this->findChildren<QPushButton *>();

//for (int i = 0; i < allpBtns.size(); i++)

//{

// allpBtns.at(i)->setStyleSheet(str2);

//}

//QList<QLabel *> allLabels = this->findChildren<QLabel *>();

//for (int i = 0; i < allLabels.size(); i++)

//{

// allLabels.at(i)->setStyleSheet(str2);

//}

//QList<QLineEdit*> allLineEdit = this->findChildren<QLineEdit*>();

//for (int i = 0; i < allLineEdit.size(); i++)

//{

// allLineEdit.at(i)->setStyleSheet(str3);

//}

}

//连接服务器槽函数

void Client::on_pBtnConn_clicked()

{

tcpSocket->abort();  //取消已有连接

tcpSocket->connectToHost(ui.lineEditIP->text(), ui.lineEditPort->text().toInt());

}

//连接状态发生变化时对应的槽函数

void Client::currState()

{

if (tcpSocket->state() == QAbstractSocket::UnconnectedState)

{

ui.plainTextEdit->setPlainText("The socket is not connected.");

}

if (tcpSocket->state() == QAbstractSocket::HostLookupState)

{

ui.plainTextEdit->setPlainText("The socket is performing a host name lookup.");

}

if (tcpSocket->state() == QAbstractSocket::ConnectingState)

{

ui.plainTextEdit->setPlainText("The socket has started establishing a connection.");

}

if (tcpSocket->state() == QAbstractSocket::ConnectedState)

{

ui.plainTextEdit->setPlainText("A connection is established.");

}

if (tcpSocket->state() == QAbstractSocket::ClosingState)

{

ui.plainTextEdit->setPlainText("The socket is about to close (data may still be waiting to be written).");

}

}

//客户端向服务器发送缓冲区的内容

void Client::on_pBtnSend_clicked()

{

QString sendMsg = ui.plainTextEdit->toPlainText();

tcpSocket->write(sendMsg.toUtf8());

}

//选择要发送的txt文件

void Client::on_pBtnSel_clicked()

{

QString filePath = QFileDialog::getOpenFileName(this,"选择文件", "", NULL);

ui.lineEditPath->setText(filePath);

}

//客户端向服务器发送txt文件

void Client::on_pBtnSendTxt_clicked()

{

QString filePath = ui.lineEditPath->text();

QFile file(filePath);

if (!file.open(QIODevice::ReadOnly | QIODevice::Text))

return;

int lineNum = 0;

while (!file.atEnd())

{

lineNum++;

QByteArray lineBytes = file.readLine();

tcpSocket->write(lineBytes);

}

file.close();

ui.plainTextEdit->setPlainText(QString::number(lineNum));

}

//接收服务器发来的信息

void Client::recvMessage()

{

QDataStream in(tcpSocket);

in.setVersion(QDataStream::Qt_4_6);

QByteArray recvBytes = tcpSocket->readAll();

ui.plainTextEdit->appendPlainText(recvBytes);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不相信眼泪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值