这里写目录标题
- 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
要包含的头文件
qmake表示 pro文件中要添加的内容
头文件里声明相应 public成员 属性
cpp文件中
设计ui界面
接收框设置为 只读
相应的对象重命名
监听
位于tcpserver中,listen函数
在widget cpp文件中
tcpServer->listen() 开启监听,监听来自所有人的连接,端口号来自ui界面中设计的内容
tcpsocket = tcpserver->nextpendingconnection(); 用这个函数获得已经连接的客户端的socket,从而可以读 和 写
查找有关信号
在 openBt_clicked()函数中
tcpServer->listen(xxxxxxxxxxxxxx toUInt) 开启监听
关闭和发送
调试 查找网络调试助手,用助手当客户端测试 编写的服务端
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
界面设计
代码部分1
在 widget h文件中定义qtcpSocket对象,然后再cpp构造函数中构建 new tcpscoket
打开客户端按钮 右键转到槽、
实现槽函数
关闭客户端
发送客户端
整体
最后一行代码 缺少 .data()
疑惑
他有一个地方SLOT() 里没有
在 connect()
函数中,如果信号的发送者和接收者之间的槽函数返回值不同,或者参数不匹配,都会导致编译错误。因此,在使用 connect()
函数时,SLOT 中必须填入与信号匹配的槽函数。如果没有填写槽函数,程序将无法编译通过。
当 readyRead()
信号被触发时,它会自动调用与之连接的槽函数进行处理。因此,在使用 connect()
函数连接 readyRead()
信号和对应的槽函数时,必须在 SLOT 中填写与信号匹配的槽函数名字。
例如,下面是一个示例代码,演示了如何使用 connect()
函数连接 QTcpSocket
的 readyRead()
信号和槽函数:
// 连接 readyRead() 信号和 readMessage() 槽函数
connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readMessage()));
// 处理新的消息函数
void MyClient::readMessage()
{
// 读取从服务器发来的数据
QByteArray msg = tcpSocket->readAll();
// 处理收到的数据
// ...
}
在上述代码中,使用 connect()
函数连接 tcpSocket
的 readyRead()
信号和处理函数 readMessage()
,当收到数据时,readMessage()
函数会被自动调用进行数据处理。如果 SLOT
中没有填写 readMessage()
函数名,程序将无法通过编译。