跳转至

TCP 服务器

前置


可以参考 TCP 客户端

在这个部分大体与 TCP 客户端部分相同:

  • 追加 network
  • 包含头文件: #include <QTcpServer>
  • 包含头文件: #include <QTcpSocket>

与 TCP 客户端相同的是, TCP 服务器也有一个专门的类用于实现相关功能。

TCP Server

初始化


初始化 QTcpServer 类。

QTcpServer *server;

对这个指针进行初始化, 在构造函数中初始化对象。

server = new QTcpServer;

监听


server 对象下, 有 listen() 方法用于监听。

该方法需要传入需要监听的网卡和端口号

// 监听指定的网卡和端口
// QHostAddress::AnyIPv4 -> 任意 IPV4 地址
// PORT 8000 端口
server->listen(QHostAddress::AnyIPv4, PORT);

判断连接


判断是否有客户端发起连接

在客户端连接到服务器后, server 对象会发出一个信号。

在连接信号与槽函数后即可实现有客户端连接后执行后续操作

widget.h 创建信号触发后的槽函数
private slots:
    // 新客户端连接函数
    void newClientHandler();
widget.cpp 槽函数执行代码
// 连接成功后执行的槽函数
void Widget::newClientHandler(){
    // 建立 TCP 连接
    QTcpSocket *socket = server->nextPendingConnection();

    // 返回显示客户端的地址和端口号
    // socket->peerAddress().toString() 获取客户端地址 QHostAddress 并转换到 QString
    // QString::number(socket->peerPort()) 获取客户端端口号 Quint16 并转换到 QString
    ui->IP_Edit->setText(socket->peerAddress().toString());
    ui->Port_Edit->setText(QString::number(socket->peerPort()));
}
widget.cpp 连接信号与槽函数, 判断是否有客户端发起连接
// 判断是否有客户端发起连接
// 如果有客户端发起连接 调用 newClientHandler 函数接收连接
connect(server, &QTcpServer::newConnection, this, &Widget::newClientHandler);