文章目录

  • 1 Qt中的TCP服务端编程
    • 1.1 TCP服务端编程介绍
    • 1.2 Qt中的TCP服务端编程

1 Qt中的TCP服务端编程

1.1 TCP服务端编程介绍

网络中的服务端:

  • 服务端是为客户端服务的,服务的内容诸如向客户端提供资源,保存客户端数据,为客户端提供功能接口等。

Client/Server软件架构简介:

Client/Server软件架构的特点:

  • 服务端被动接受连接(服务端无法主动连接客户端)。
  • 服务端必须公开网络地址(容易受到攻击)。
  • 在职责上:
    • 客户端倾向于处理用户交互及体验(GUI)。
    • 服务端倾向于用户数据的组织和存储(数据处理)。

Browser/Server软件架构简介(B/S):

  • B/S是一种特殊的C/S网络架构。
  • B/S中的客户端统一使用浏览器(Browser)。
  • B/S中的客户端GUI通常采用HTML进行开发。
  • B/S中的客户端与服务端通常采用http协议进行通信。

1.2 Qt中的TCP服务端编程


Qt中的TCP服务端编程:

  • Qt提供了QTcpServer类(封装了TCP协议细节)。
  • 将QTcpServer的对象当作黑盒使用,进行连接监听。
  • 每一个连接生成一个QTcpSocket对象进行通信。

QTcpServer的使用方式:

  1. 禁停本机地址的端口(listen())。
  2. 通过信号通知客户端连接(newConnection())。
  3. 获取QTcpSocket通信对象(nextPendingConnection())。
  4. 停止监听(close())。

QTcpServer的注意事项:

  • 用于处理客户端连接,不进行具体通信。
  • 监听的端口只用于响应连接请求。
  • 监听到连接后,生成QTcpSocket对象与客户端通信。

Client/Server交互流程:

代码实现如下:

ServerDemo.h:

#ifndef SERVERDEMO_H
#define SERVERDEMO_H#include <QObject>
#include <QTcpServer>class ServerDemo : public QObject
{Q_OBJECTQTcpServer m_server;public:ServerDemo(QObject* parent = NULL);bool start(int port);void stop();~ServerDemo();protected slots:void onNewConnection();void onConnected();void onDisconnected();void onDataReady();void onBytesWritten(qint64 bytes);
};#endif // SERVERDEMO_H

ServerDemo.cpp:

#include "ServerDemo.h"
#include <QHostAddress>
#include <QTcpSocket>
#include <QObjectList>
#include <QDebug>ServerDemo::ServerDemo(QObject* parent) : QObject(parent)
{connect(&m_server, SIGNAL(newConnection()), this, SLOT(onNewConnection()));
}void ServerDemo::onNewConnection()
{qDebug() << "onNewConnection";QTcpSocket* tcp = m_server.nextPendingConnection();connect(tcp, SIGNAL(connected()), this, SLOT(onConnected()));connect(tcp, SIGNAL(disconnected()), this, SLOT(onDisconnected()));connect(tcp, SIGNAL(readyRead()), this, SLOT(onDataReady()));connect(tcp, SIGNAL(bytesWritten(qint64)), this, SLOT(onBytesWritten(qint64)));
}void ServerDemo::onConnected()
{QTcpSocket* tcp = dynamic_cast<QTcpSocket*>(sender());if( tcp != NULL ){qDebug() << "onConnected";qDebug() << "Local Address:" << tcp->localAddress();qDebug() << "Local Port:" << tcp->localPort();}
}void ServerDemo::onDisconnected()
{qDebug() << "onDisconnected";
}void ServerDemo::onDataReady()
{QTcpSocket* tcp = dynamic_cast<QTcpSocket*>(sender());char buf[256] =  {0};if( tcp != NULL ){qDebug() << "onDataReady:" << tcp->read(buf, sizeof(buf)-1);qDebug() << "Data:" << buf;}
}void ServerDemo::onBytesWritten(qint64 bytes)
{qDebug() << "onBytesWritten:" << bytes;
}bool ServerDemo::start(int port)
{bool ret = true;if( !m_server.isListening() ){ret = m_server.listen(QHostAddress("127.0.0.1"), port);}return ret;
}void ServerDemo::stop()
{if( m_server.isListening() ){m_server.close();}
}ServerDemo::~ServerDemo()
{const QObjectList& list = m_server.children();for(int i=0; i<list.length(); i++){QTcpSocket* tcp = dynamic_cast<QTcpSocket*>(list[i]);if( tcp != NULL ){tcp->close();}}
}

main.cpp:

#include <QCoreApplication>
#include <QTcpSocket>
#include <QDebug>
#include <QThread>
#include "ClientDemo.h"
#include "ServerDemo.h"void SyncClientDemo()
{QTcpSocket client;char buf[256] = {0};client.connectToHost("127.0.0.1", 8080);qDebug() << "Connected:" << client.waitForConnected();qDebug() << "Send Bytes:" << client.write("D.T.Software");qDebug() << "Send Status:" << client.waitForBytesWritten();qDebug() << "Data Available:" << client.waitForReadyRead();qDebug() << "Received Bytes:" << client.read(buf, sizeof(buf)-1);qDebug() << "Received Data:" << buf;client.close();// client.waitForDisconnected();
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);ServerDemo server;server.start(8080);return a.exec();
}

参考资料:

  1. QT实验分析教程

Qt中TCP服务端编程相关推荐

  1. Qt 多线程TCP服务端一键关闭所有客户端

    Qt 多线程TCP服务端一键关闭所有客户端 任务描述: 实现多线程TCP服务端一键关闭所有客户端的连接. 解决过程: 1.Qt的服务端提供了close的功能,但是只用来不响应新接入的客户端. 手册中是 ...

  2. Qt多线程 TCP 服务端

    Qt实现 多线程 TCP 服务端 因为项目中要用到TCP客户端的并发处理,所以TCP服务端用多线程去实现是必要的.于是花了一大早上的时间写了一各Demo 如图: 主要关键代码: 关于线程的处理.关于线 ...

  3. Qt 的 tcp服务端讲解

    TCP TCP : (Tramsmission Control Protocl)传输控制协议,一种面向连接的,可靠的,基于字节流的传输层通信协议. 本文目标 实现一个简单的服务器,可以接受客户端的信息 ...

  4. QT 之 TCP 服务端 连接 多客户端 处理学习

    自学QT中, 在此记录一下TCP多链接的方法. 跟着 "Qt Creator快速入门" 学了一段时间了,刚接触网络编程, 例子中仅仅简单的 用 客户端 连接了一下 服务端, 然后 ...

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

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

  6. C#中面向连接的客户端与服务端编程

    1)         流程 2)         服务端程序特点 Ø 一般启动后就一直处于运行状态,以等待客户端进程的请求 Ø 使用的端口往往是熟知端口,便于客户机进程连接请求 Ø 一般拥有较多的系统 ...

  7. MFC:Socket编程—TCP服务端和多个客户端通信

    前言 MFC是微软基础类库,于 C++ 对于 C语言来说,MFC对于window API ,MFC 就相当于C++,window API 相当于C.MFC 封装了 window API 使用起来更加的 ...

  8. Qt的Tcp服务器多线程编程-附带代码展示

    Qt的Tcp服务器多线程编程-附带代码展示 该程序主要实现tcp服务器如何使用多线程的方式来连接多个客户端,此文章没有实现客户端的多线程编程. 创建子线程时需要注意的点: 1.子线程与主线程之间交互数 ...

  9. 急速rust服务器管理_Rust 与服务端编程的碎碎念

    Rust 是 Mozilla 推出的一门系统编程语言,非常看重内存安全,是一门非常优秀的语言.Mozilla 用它构建了其下一代的浏览器内核 servo,其工程能力毋庸置疑. 那么,Rust在服务端编 ...

最新文章

  1. 程序猿真成猴了? | 每日趣闻
  2. ElasticSearch ected map for property [fields] on field [subject_id] but got a class java.lang
  3. linux禁止修 5在线阅读,linux – 如何在不重新编译内核的情况下禁用CentOS 5.3中的nf_conntrack内核模块...
  4. socket c/s分佈式編程
  5. c++三维静态数组的定义与作为函数的传递
  6. 一步步创建第一个Docker App —— 4. 部署应用
  7. matplotlib fontdict 字体设置
  8. Too many authentication failures for
  9. 【九天教您南方cass 9.1】 08 绘制等高线及对其处理
  10. 软件工程——瀑布模型、快速原型模型、增量模型、螺旋模型
  11. R语言进行人年发病率可信区间计算(per 1,000 person-years)
  12. 等额本息和等额本金、提前还款
  13. 最近超火的公司前端面试题
  14. testbench——文件读入输出
  15. VC6中工具条的新特色 (转)
  16. 关于Ubuntu启动activeMq无效果的错误解决方案
  17. 【机器学习】Scikit-Learn数据预处理文档翻译+笔记记录 - 1
  18. h'tml和java代码,Tapestry 教程(七)在Tapestry中一起使用Hibernate
  19. GTD系列之我为什么使用GTD管理个人体系
  20. 黑马程序员——OC基础05—Foundation框架

热门文章

  1. 【控制】《多智能体系统一致性协同演化控制理论与技术》纪良浩老师-第5章-多智能体系统双阶脉冲一致性
  2. 2.2 清除标注错误的数据-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授
  3. 第一章 介绍-机器学习老师板书-斯坦福吴恩达教授
  4. 3.10 直观理解反向传播-深度学习-Stanford吴恩达教授
  5. 单片机 10种软件滤波方法的示例程序
  6. LINUX 使用tcgetattr函数与tcsetattr函数控制终端一
  7. android:persistent属性
  8. 【DIY】送给儿子的礼物——DIY故事机(音乐播放器)
  9. C++基本操作符重载
  10. GitNote 基于 Git 的跨平台笔记软件正式发布