自己跟着老师的课程一步步跟着写下来的,有需要的可以自取,有用的话还希望点一个小小的赞同哦~
视频连接专栏的前几篇文章有,此处就不再冗余的放了(其实就是懒得粘贴链接了~~~)
七、TCP 服务器
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
#define PORT 8000 //定义宏,端口号
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 newClientHandler();
void clientInfoSlot(); //客户端消息的槽函数
private:
Ui::Widget *ui;
QTcpServer *server;
};
#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);
server = new QTcpServer;
server->listen(QHostAddress::AnyIPv4, PORT); //两个参数,监听哪个网卡,监听的端口号
//客户端发起连接,server发出信号
connect(server,&QTcpServer::newConnection,this,&Widget::newClientHandler);
}
Widget::~Widget()
{
delete ui;
}
void Widget::newClientHandler()
{
// 建立TCP连接,返回QTcpSocket类型的地址,所以创建一个指针socket,IP地址和端口号都保存在socket里面
QTcpSocket *socket = server->nextPendingConnection();
// socket->peerAddress(); //获取客户端的地址
// socket->peerPort(); // 获取端口号
//打印客户端信息
ui->ipLineEdit->setText(socket->peerAddress().toString());
ui->portLineEdit->setText(QString::number(socket->peerPort()));
//服务器收到客户端发送的信息,socket发出 readyread 信号
connect(socket,&QTcpSocket::readyRead,this,&Widget::clientInfoSlot);
}
void Widget::clientInfoSlot()
{
//在此函数中获取 newClientHandler 函数里面的局部变量 socket
QTcpSocket *s = (QTcpSocket *)sender(); //槽函数中调用sender 可以获取信号的发出者。 强转一个新类型
ui->mainLineEdit->setText(QString(s->readAll()));
// mainLineEdit 类型在此路径文件中 D:\QT\Qtproject\QtOnline\build-TcpServer-Desktop_Qt_5_14_2_MinGW_32_bit-Debug\ui_widget.h
}