下一篇: QT网络编程开发客户端

文章目录

  • 基于Qt的网络编程服务端
  • QTcpServer
    • 配置
    • listen() close()
    • newConnection()
    • SINGL
      • readyRead()
        • isReadable
        • readAll
      • disconnected()
  • TcpServer项目训练
    • widget.h
    • widget.cpp

来源:微信公众号「编程学习基地」

基于Qt的网络编程服务端

QTcpServer

提供一个TCP基础服务类 继承自QObject,这个类用来接收到来的TCP连接,可以指定TCP端口或者用QTcpServer自己挑选一个端口,可以监听一个指定的地址或者所有的机器地址。

程序示例:

QTcpServer的信号:

newConnection()      //有新连接连接时触发该信号

配置

pro文件添加

QT += network

枚举设备所有ip地址

QList<QHostAddress> ipList = QNetworkInterface::allAddresses();
QStringList addressStrList;
addressStrList.clear();for(int index = 0;index<ipList.size();index++)
{if(ipList.at(index).isNull())   continue;         //如果地址为空,则去掉QAbstractSocket::NetworkLayerProtocol protocol = ipList.at(index).protocol();if(protocol != QAbstractSocket::IPv4Protocol)   continue;           //只取IPV4的地址addressStrList.append(ipList.at(index).toString());
}
ui->comboBox_Address->addItems(addressStrList);

listen() close()

调用listen()来监听所有的连接,调用close()来关闭套接字,停止对连接的监听。

如果监听有错误,serverError()返回错误的类型。调用errorString()来把错误打印出来

bool isListening()   const

当服务端正在监听连接时候返回真,否则返回假

QString serverAddressStr = ui->comboBox_Address->currentText();     //获取服务器ip地址
quint16 port = ui->lineEdit_port->text().toInt();                   //获取服务器端口
QHostAddress serverAddress = QHostAddress(serverAddressStr);        //初始化协议族if(mServer->isListening())
{//在监听状态 取消监听mServer->close();
}
else
{//不在监听状态 开始监听if(mServer->listen(serverAddress, port)){//监听成功qDebug() << "Listen Ok!!";}else{//监听失败QMessageBox::warning(this, "Tcp Server Listen Error", mServer->errorString());}
}

当监听连接时候,可以调用serverAddress()和serverPort()来返回服务端的地址和端口。

newConnection()

每当一个newConnection新的客户端连接到服务端就会发射信号newConnection()

调用nextPendingConnection()来接受待处理的连接。返回一个连接的QTcpSocket(),我们可以用这个返回的套接字和客户端进行连接

private slots:void newConnectionSlot();           //新连接
//处理新连接客户端
connect(mServer, SIGNAL(newConnection()),this, SLOT(newConnectionSlot()));
void Widget::newConnectionSlot()
{mClient = mServer->nextPendingConnection();connect(mClient, SIGNAL(readyRead()),this, SLOT(readyReadSlot()));//接收消息connect(mClient, SIGNAL(disconnected()),this, SLOT(disconnectedSlot()));//断开连接
}

SINGL

readyRead()

客户端有数据发送至服务端时触发该信号

connect(mClient, SIGNAL(readyRead()),this, SLOT(readyReadSlot()));          //接收消息
isReadable

是否可读

readAll

读取客户端发送过来的全部信息

if(mClient->isReadable())
{QByteArray recvArray = mClient->readAll();
}
disconnected()

当客户端断开连接时触发该信号

connect(mClient, SIGNAL(disconnected()),this, SLOT(disconnectedSlot()));    //断开连接

TcpServer项目训练

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QNetworkInterface>
#include <QAbstractSocket>
#include <QTcpServer>
#include <QTcpSocket>
#include <QMessageBox>
#include <QDateTime>namespace Ui {class Widget;
}class Widget : public QWidget
{Q_OBJECT
public:explicit Widget(QWidget *parent = nullptr);~Widget();
private slots:void on_pushButton_listen_clicked();//开始监听void newConnectionSlot();           //新连接void disconnectedSlot();            //断开连接void readyReadSlot();               //接收消息的槽函数void on_pushButton_send_clicked(); //发送消息private:void enumIpAddress();             //枚举当前设备所有端口
private:Ui::Widget *ui;QTcpServer *mServer;             //服务器QTcpSocket *mClient = nullptr;        //客户端QList<QTcpSocket *>mClientList;      //客户端链表
};#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);mServer = new QTcpServer;enumIpAddress();//处理新连接客户端connect(mServer, SIGNAL(newConnection()),this, SLOT(newConnectionSlot()));
}Widget::~Widget()
{delete ui;
}
void Widget::enumIpAddress()
{QList<QHostAddress> ipList = QNetworkInterface::allAddresses();QStringList addressStrList;addressStrList.clear();for(int index = 0;index<ipList.size();index++){if(ipList.at(index).isNull())   continue;         //如果地址为空,则去掉QAbstractSocket::NetworkLayerProtocol protocol = ipList.at(index).protocol();if(protocol != QAbstractSocket::IPv4Protocol)   continue;           //只取IPV4的地址addressStrList.append(ipList.at(index).toString());}ui->comboBox_Address->addItems(addressStrList);
}void Widget::on_pushButton_listen_clicked()
{QString serverAddressStr = ui->comboBox_Address->currentText();     //获取服务器ip地址quint16 port = ui->lineEdit_port->text().toInt();                   //获取服务器端口QHostAddress serverAddress = QHostAddress(serverAddressStr);        //初始化协议族if(mServer->isListening()){//在监听状态 取消监听mServer->close();ui->pushButton_listen->setText("监听");}else{//不在监听状态 开始监听if(mServer->listen(serverAddress, port)){//监听成功qDebug() << "Listen Ok!!";ui->pushButton_listen->setText("停止监听");}else{//监听失败QMessageBox::warning(this, "Tcp Server Listen Error", mServer->errorString());}}
}void Widget::newConnectionSlot()
{QString clientInfo;mClient = mServer->nextPendingConnection();mClientList.append(mClient);//窥视Client 信息clientInfo = mClient->peerAddress().toString() + ":"+  QString::number(mClient->peerPort());ui->listWidget_client->addItem(clientInfo);connect(mClient, SIGNAL(readyRead()),this, SLOT(readyReadSlot()));          //接收消息connect(mClient, SIGNAL(disconnected()),this, SLOT(disconnectedSlot()));    //断开连接
}void Widget::readyReadSlot()
{QByteArray recvArray;QTcpSocket* current = nullptr;if(!mClientList.isEmpty()){//接收客户端数据
//        for(int index = 0;index < mClientList.count();index ++)
//        {//            current = mClientList.at(index);//            if(current->isReadable())
//            {//                recvArray = current->readAll();
//                if(recvArray.isEmpty()) continue;
//                QString str = QString(QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss ddd")) +
//                        ":Recv\n" + str.fromLocal8Bit(recvArray.data());    //本地GBK转Unicode 解决乱码
//                ui->textBrowser_recv->append(str);
//                break;
//            }
//        }//转发给其他客户端
//        for(int index = 0;index < mClientList.count();index ++)
//        {//            QTcpSocket* temp = mClientList.at(index);//           if(current == temp) continue;//           if(temp->isWritable())//           {//                temp->write(recvArray);
//            }
//        }
//    }//一对一接收,只接受最近的一次消息if(mClient!=nullptr){if(mClient->isReadable()){QByteArray recvArray = mClient->readAll();QString str = QString(QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss ddd")) +":Recv\n" + str.fromLocal8Bit(recvArray.data());    //本地GBK转Unicode 解决乱码ui->textBrowser_recv->append(str);}}
}void Widget::disconnectedSlot()
{QMessageBox::information(this, "client close Signal", "client over");
}void Widget::on_pushButton_send_clicked()
{QString sendString = ui->plainTextEdit_send->toPlainText();QByteArray sendArr = sendString.toLocal8Bit();//群发给所有客户端连接
//    if(!mClientList.isEmpty())
//    {//        for(int index = 0;index < mClientList.count();index ++)
//        {//            QTcpSocket* temp = mClientList.at(index);
//            if(temp->isWritable())
//            {//                temp->write(sendArr);
//            }
//        }
//    }
//    QString str = QString(QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss ddd"))//           + ":Send\n" + sendString;
//    ui->textBrowser_recv->append(str);          //本地GBK转Unicode 解决乱码//一对一发送,只会发送给最近的一个客户端连接if(mClient!=nullptr){if(mClient->isWritable()){QString sendString = ui->plainTextEdit_send->toPlainText();QByteArray sendArr = sendString.toLocal8Bit();mClient->write(sendArr);QString str = QString(QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss ddd"))+ ":Send\n" + sendString;ui->textBrowser_recv->append(str);          //本地GBK转Unicode 解决乱码}}
}

QT网络编程开发服务端相关推荐

  1. Qt:Qt实现Winsock网络编程—TCP服务端和客户端通信(多线程)

    Qt实现Winsock网络编程-TCP服务端和客户端通信(多线程) 前言 感觉Winsock网络编程的api其实和Linux下网络编程的api非常像,其实和其他编程语言的网络编程都差不太多.博主用Qt ...

  2. java贪吃蛇客户端服务器_java Socket套接字TCP编程开发服务端和客户端之间的通信 - 贪吃蛇学院-专业IT技术平台...

    超级简单,没有太多实质内容的Socket服务端,客户端小程序 先运行server 再运行client OK 服务端代码如下: public class Server { public static v ...

  3. Qt网络编程概述(一)

    分享主题 Qt网络编程概述(一) Qt网络编程之QTCPSocket和QTCPServer实例(二) Qt网络编程之QUdpSocket实例(三) Qt网络编程概述 QtNetWork模块提供了若干类 ...

  4. qt android 网络编程实例,QT网络编程Tcp下C/S架构的即时通信实例

    先写一个客户端,实现简单的,能加入聊天,以及加入服务器的界面. #ifndef TCPCLIENT_H #define TCPCLIENT_H #include #include #include # ...

  5. Qt网络编程——TCP

    Qt网络编程--TCP 1. 概念 2. 服务器 3. 客户端 4. TCP服务器和客户端互传文件 5. 资源下载 1. 概念 TCP(Transmission Control Protocol, 传 ...

  6. 【网络编程开发系列】好端端的MQTT-broker重新部署后居然出现TLS握手失败了

    摘要:本文通过一次真实的现网案例复盘,深度还原TLS握手问题的排查思路和方法,希望对广大读者有所启发和帮助. 文章目录 1 写在前面 2 问题描述 2.1 项目背景 2.2 现场问题 3 场景复现 3 ...

  7. Qt网络编程电子白板

    Qt网络编程电子白板 2018-08-11 08:44:04 天行健_地势坤 阅读数 915更多 分类专栏: Qt 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原 ...

  8. 第十四章:Qt网络编程

    回顾: 第一章:Qt的概述 第二章:在Ubuntu编写第一个Qt程序 第三章:Qt的字符串和字符编码 第四章:Qt的信号和槽 第五章:Qt容器窗口(父窗口) 第六章:面向对象的Qt编程 第七章:Qt设 ...

  9. iOS网络编程开发—HTTP协议

    iOS网络编程开发-HTTP协议 说明:apache tomcat服务器必须占用8080端口 一.URL 1.基本介绍 URL的全称是Uniform Resource Locator(统一资源定位符) ...

最新文章

  1. qq分享 设备未授权报错解决方案_QQ 注销功能终于上线,我体验了一下!
  2. 把Zend Studio 5.5改为简体中文版的办法
  3. 如何在ChemDraw中打出符号π
  4. SQL数据库语言基础之SqlServer数据表的六大约束(主键、外键、检查、非空、唯一性、默认值约束)的创建
  5. python 3.28 第三章 函数嵌套/名称空间//内置名称空间/全局名称空间/局部名称空间/作用域/函数对象/闭包函数。...
  6. 《java入门第一季》之面向对象(static关键字内存图解)
  7. 复习和练习2 连接查询,子查询,分页查询
  8. iOS 知名公司资讯汇集~招聘内推
  9. 一天一看————以太网交换机的基本原理与配置!
  10. 如何用windows7搭建radius服务器
  11. 三年半经验,蚂蚁头条快手怎么选?网友:第一次看到头条比快手offer低的
  12. 谷歌浏览器Chrome 100即将发布,但可能无法正常使用?
  13. 一道简单的电商数据分析笔试题:求组合商品的库存量
  14. 十二星座 谁是 “小笨猪” ?
  15. DRGs SQL数据库查询城镇职工医保定点医疗机构药占比
  16. Javascript迭代、递推、穷举、递归常用算法实例讲解
  17. php中foreach 循环null,php中foreach循环问题
  18. 达达-高性能服务端优化之路
  19. 调用Minitab软件应用于工业数据分析
  20. Win2012R2安装过程细节记录

热门文章

  1. angularjs 1.6.5跨域
  2. linux下xl2tpd安装
  3. JAVA第九次作业《第11章-方法的重载-作业-分段函数》
  4. 有效打造你的个人品牌
  5. 下列计算机应用中属于计算机辅助教学的事,2017年计算机基础考试题库完整版「附答案解析」...
  6. android 蓝牙打印机
  7. 3.15晚会不够“狠” 央视让观众失望
  8. python爬虫----图片爬取之高清原图
  9. 希捷发布5款消费存储产品 打通移动市场
  10. python 三维折线图_Matplotlib.pyplot 三维绘图的实现示例