前言:服务端实现逻辑借助epoll, 网络学习-epoll(四)
一、TCP
之前在网络的学习时,为快速理解linux网络I/O模型,客户端是借助网络调试助手,现在回过头来看看,这个网络调试助手,也是用QT进行开发的
这边也简单实现一个网络助手:
实现简单的收发功能
需要注意的是,目前要用到socket
,根据QT6官方给的文档,必须要在自己项目的CMakelists.txt
中,添加如下语句
find_package(Qt6 REQUIRED COMPONENTS Network)
target_link_libraries(proj_name PRIVATE Qt6::Network)
- 连接网络功能
void Widget::on_connect_Button_clicked()
{
//如果已连接,就断开连接
if(socket->state() == QAbstractSocket::ConnectedState){
socket->disconnectFromHost();
ui->connect_Button->setText("连接网络");
return;
}
//先获取IP地址和端口号
QString server_ip = ui->server_address_lineEdit->text();
QString server_port = ui->server_port_lineEdit->text();
if(server_ip.isEmpty() || server_port.isEmpty()){
QMessageBox::warning(this, "警告", "服务器地址或端口不能为空");
return;
}else{
socket->connectToHost(QHostAddress(server_ip), server_port.toShort());
//设置按钮为“正在连接...”
ui->connect_Button->setText("正在连接...");
ui->connect_Button->setEnabled(false);
}
}
- 发送数据功能
void Widget::on_send_Button_clicked()
{
//如果服务器未连接,返回
if(socket->state() != QAbstractSocket::ConnectedState){
QMessageBox::warning(this, "警告", "未连接服务器");
return;
}
QString message = ui->send_textEdit->toPlainText();
if(message.isEmpty()){
QMessageBox::warning(this, "警告","发送内容不能为空");
return;
}
//开始发送数据
QByteArray ba = message.toUtf8();
socket->write(ba);
// 在接收框显示自己发送的消息
ui->receive_textBrowser->append("client: " + message);
// 清空发送框
ui->send_textEdit->clear();
}
- 新增一个清空接收数据的按钮
void Widget::on_clear_receive_Button_clicked()
{
ui->receive_textBrowser->clear();
}
***PS:***总体写下来,就简单的收发,比我想象中的代码要清晰很多,毕竟QT官方搞了这么多年,把许多细节全部封装了,提高了开发效率。