文章目录
简述
掌握socket中TCP客户端和服务器端通信,传送准确的信息方法;能够完成socket中TCP等\客户端和服务器端通信,能够传送准确的信息。
实验步骤
新建项目
1、打开软件Qt creator
2、建立一个项目
选择类项为QWidget
3、除了main.cpp以及.pro文件之外的其他文件全部删除
4、通过项目添加新文件,在qt中,添加Qt设计师界面类
添加QT网络编程库
在.h中添加类、函数、变量
TCPserver.h相关类等
#ifndef SERVER_H
#define SERVER_H
#include <QDialog>
class QTcpServer;
namespace Ui {
class Server;
}
class Server : public QDialog
{
Q_OBJECT
public:
explicit Server(QWidget *parent = 0);
~Server();
private:
Ui::Server *ui;
QTcpServer *tcpServer;
private slots:
void sendMessage();
};
#endif // SERVER_H
TCPclient.h相关类等
#ifndef CLIENT_H
#define CLIENT_H
#include <QDialog>
#include <QAbstractSocket>
class QTcpSocket;
namespace Ui {
class Client;
}
class Client : public QDialog
{
Q_OBJECT
public:
explicit Client(QWidget *parent = 0);
~Client();
private:
Ui::Client *ui;
QTcpSocket *tcpSocket;
QString message;
// 用来存放数据的大小信息
quint16 blockSize;
private slots:
void newConnect();
void readMessage();
void displayError(QAbstractSocket::SocketError);
void on_connectButton_clicked();
};
#endif // CLIENT_H
在.cpp文件中实现设计功能
TCPserver.cpp程序设计代码
#include "server.h"
#include "ui_server.h"
#include <QtNetwork>
Server::Server(QWidget *parent) :
QDialog(parent),
ui(new Ui::Server)
{
ui->setupUi(this);
tcpServer = new QTcpServer(this);
// 使用了IPv4的本地主机地址,等价于QHostAddress("127.0.0.1")
//在cmd中,使用ipconfig命令来进行查找ip信息
if (!tcpServer->listen(QHostAddress::LocalHost, 6666)) {
qDebug() << tcpServer->errorString();
close();
}
connect(tcpServer, &QTcpServer::newConnection,
this, &Server::sendMessage);
}
Server::~Server()
{
delete ui;
}
void Server::sendMessage()
{
// 用于暂存要发送的数据
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
// 设置数据流的版本,客户端和服务器端使用的版本要相同
out.setVersion(QDataStream::Qt_5_6);
out << (quint16)0;
//QString形式
//out << tr("hello TCP!!!");
out << ui->lineEdit->text();
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
// 获取已经建立的连接的套接字
QTcpSocket *clientConnection = tcpServer->nextPendingConnection();
connect(clientConnection, &QTcpSocket::disconnected,
clientConnection, &QTcpSocket::deleteLater);
clientConnection->write(block);
clientConnection->disconnectFromHost();
// 发送数据成功后,显示提示
ui->label->setText(tr("发送数据成功!!!"));
}
TCPclient.cpp程序设计代码
#include "client.h"
#include "ui_client.h"
#include <QtNetwork>
Client::Client(QWidget *parent) :
QDialog(parent),
ui(new Ui::Client)
{
ui->setupUi(this);
tcpSocket = new QTcpSocket(this);
connect(tcpSocket, &QTcpSocket::readyRead, this, &Client::readMessage);
connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)),
this, SLOT(displayError(QAbstractSocket::SocketError)));
}
Client::~Client()
{
delete ui;
}
void Client::newConnect()
{
// 初始化数据大小信息为0
blockSize = 0;
// 取消已有的连接
tcpSocket->abort();
tcpSocket->connectToHost(ui->hostLineEdit->text(),
ui->portLineEdit->text().toInt());
}
void Client::readMessage()
{
QDataStream in(tcpSocket);
// 设置数据流版本,这里要和服务器端相同
in.setVersion(QDataStream::Qt_5_6);
// 如果是刚开始接收数据
if (blockSize == 0) {
//判断接收的数据是否大于两字节,也就是文件的大小信息所占的空间
//如果是则保存到blockSize变量中,否则直接返回,继续接收数据
if(tcpSocket->bytesAvailable() < (int)sizeof(quint16)) return;
in >> blockSize;
}
// 如果没有得到全部的数据,则返回,继续接收数据
if(tcpSocket->bytesAvailable() < blockSize) return;
// 将接收到的数据存放到变量中
in >> message;
// 显示接收到的数据
ui->messageLabel->setText(message);
}
void Client::displayError(QAbstractSocket::SocketError)
{
qDebug() << tcpSocket->errorString();
}
void Client::on_connectButton_clicked()
{
newConnect();
}
ui界面设计
TCPserver.ui
TCPclient.ui
实验验证
本人是一枚新手,开发过程中可能有一些错误出现,如果大牛看到请及时指正,非常感谢;或者有不同的看法盆友们,欢迎在下方评论区一起讨论、学习、进步 !!!
本人在CSDN上写的内容均为本人原创,转载需经本人同意!