qt学习 tcp实现 c++

这里写目录标题

  • qt网络编程
  • qt下的TCP 编程
    • 设计ui界面
    • 监听
    • 关闭和发送
    • 调试 查找网络调试助手,用助手当客户端测试 编写的服务端
    • newConnection()
    • newConnection_Slot()
  • Tcp Client
    • 界面设计
    • 代码部分1
    • 关闭客户端
    • 发送客户端
    • 整体
    • 疑惑

https://www.bilibili.com/video/BV1tp4y1i7EJ/?p=13&spm_id_from=pageDriver&vd_source=e7d12c9f66ab8294c87125a95510dac9

qt网络编程

网络编程有tcp和udp

qt下的TCP 编程

TCP编程两个类: QTcpserver qtcpSocket
qt学习 tcp实现 c++_第1张图片
要包含的头文件
qmake表示 pro文件中要添加的内容
qt学习 tcp实现 c++_第2张图片
头文件里声明相应 public成员 属性
qt学习 tcp实现 c++_第3张图片
cpp文件中
qt学习 tcp实现 c++_第4张图片

设计ui界面

qt学习 tcp实现 c++_第5张图片
接收框设置为 只读
相应的对象重命名
qt学习 tcp实现 c++_第6张图片

监听

位于tcpserver中,listen函数

在widget cpp文件中

tcpServer->listen() 开启监听,监听来自所有人的连接,端口号来自ui界面中设计的内容


tcpsocket = tcpserver->nextpendingconnection(); 用这个函数获得已经连接的客户端的socket,从而可以读 和 写

查找有关信号




qt学习 tcp实现 c++_第7张图片

qt学习 tcp实现 c++_第8张图片

在 openBt_clicked()函数中

tcpServer->listen(xxxxxxxxxxxxxx toUInt) 开启监听

关闭和发送

qt学习 tcp实现 c++_第9张图片

调试 查找网络调试助手,用助手当客户端测试 编写的服务端

newConnection()

newConnection() 是 Qt 中 QTcpServer 类的一个信号,它在有新的客户端连接到服务器时被触发。当 QTcpServer 监听的套接字(Socket)接收到新的连接请求时,就会发出 newConnection() 信号,用来通知应用程序有新的连接已经建立,并且可以通过调用 nextPendingConnection() 函数获取到对应的 QTcpSocket 对象,用于进行数据的收发。

下面是一个使用 QTcpServer 的例子,演示了如何处理 newConnection() 信号:

// 创建并监听 QTcpServer 对象
QTcpServer *tcpServer = new QTcpServer(this);
tcpServer->listen(QHostAddress::Any, port);

// 连接 newConnection() 信号
connect(tcpServer, &QTcpServer::newConnection, this, &MyServer::onNewConnection);

// 处理新连接函数
void MyServer::onNewConnection()
{
    QTcpSocket *clientSocket = tcpServer->nextPendingConnection();
    // 处理新的客户端连接
}

在上述代码中,创建了一个 QTcpServer 对象 tcpServer,并监听指定的端口。然后,通过 connect() 函数连接 newConnection() 信号和处理函数 onNewConnection(),当有新的客户端连接请求时, onNewConnection() 函数就会被执行,并通过 nextPendingConnection() 函数获取到对应的客户端 QTcpSocket 对象,用于进行数据的收发处理。

newConnection_Slot()

newConnection_Slot() 不是 Qt 中内置的函数或信号槽,它可能是某个应用程序中自定义的槽函数,用来处理 QTcpServer::newConnection() 信号的连接事件。

例如,在使用 QTcpServer 搭建一个简单的 TCP 服务器时,可能需要自定义一个槽函数 newConnection_Slot() 来处理新连接事件,示例如下:

// 创建并监听 QTcpServer 对象
tcpServer = new QTcpServer(this);
tcpServer->listen(QHostAddress::Any, port);

// 连接 newConnection() 信号和槽函数
connect(tcpServer, &QTcpServer::newConnection, this, &MyServer::newConnection_Slot);

// 处理新连接事件
void MyServer::newConnection_Slot()
{
    // 获取新连接的 QTcpSocket 对象
    QTcpSocket *clientSocket = tcpServer->nextPendingConnection();
    
    // 将新客户端的请求发送给处理函数 ClientMsgHandler,该函数可以根据协议处理收到的数据
    connect(clientSocket, &QTcpSocket::readyRead, this, &MyServer::ClientMsgHandler);
    
    // 将客户端断开连接的信号与处理函数 DisconnectedHandler 连接起来,当客户端断开连接时触发该函数
    connect(clientSocket, &QTcpSocket::disconnected, this, &MyServer::DisconnectedHandler);
}

在上述代码中,newConnection_Slot() 为自定义的槽函数,用来处理新连接事件。当有新的客户端连接请求时,该函数将通过 nextPendingConnection() 函数获取到对应的 QTcpSocket 对象,并通过 connect() 函数将其收到的数据发送给处理函数 ClientMsgHandler() 进行协议处理。此外,还将客户端断开连接的信号与处理函数 DisconnectedHandler() 连接起来,当客户端断开连接时触发该函数进行对应的操作。

Tcp Client

qt学习 tcp实现 c++_第10张图片
qt学习 tcp实现 c++_第11张图片

界面设计

qt学习 tcp实现 c++_第12张图片

代码部分1

在 widget h文件中定义qtcpSocket对象,然后再cpp构造函数中构建 new tcpscoket

qt学习 tcp实现 c++_第13张图片
打开客户端按钮 右键转到槽、
qt学习 tcp实现 c++_第14张图片
实现槽函数
qt学习 tcp实现 c++_第15张图片

关闭客户端

qt学习 tcp实现 c++_第16张图片

发送客户端

qt学习 tcp实现 c++_第17张图片

整体

qt学习 tcp实现 c++_第18张图片
最后一行代码 缺少 .data()

qt学习 tcp实现 c++_第19张图片

疑惑

他有一个地方SLOT() 里没有

connect() 函数中,如果信号的发送者和接收者之间的槽函数返回值不同,或者参数不匹配,都会导致编译错误。因此,在使用 connect() 函数时,SLOT 中必须填入与信号匹配的槽函数。如果没有填写槽函数,程序将无法编译通过。

readyRead() 信号被触发时,它会自动调用与之连接的槽函数进行处理。因此,在使用 connect() 函数连接 readyRead() 信号和对应的槽函数时,必须在 SLOT 中填写与信号匹配的槽函数名字。

例如,下面是一个示例代码,演示了如何使用 connect() 函数连接 QTcpSocketreadyRead() 信号和槽函数:

// 连接 readyRead() 信号和 readMessage() 槽函数
connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readMessage()));

// 处理新的消息函数
void MyClient::readMessage()
{
    // 读取从服务器发来的数据
    QByteArray msg = tcpSocket->readAll();
    
    // 处理收到的数据
    // ...
}

在上述代码中,使用 connect() 函数连接 tcpSocketreadyRead() 信号和处理函数 readMessage(),当收到数据时,readMessage() 函数会被自动调用进行数据处理。如果 SLOT 中没有填写 readMessage() 函数名,程序将无法通过编译。

你可能感兴趣的:(qt初步,qt,学习,tcp/ip)