Qt 4.6自带的threaddedfortuneserver是个简单明了的 Qt  C/S网络编程server端程序的例子, 该例子演示了 QTcpServer与QThread配合的方法。 代码不多, 但包含了Qt网络编程的几个关键点。

- FortuneServer类从QTcpServer派生, 调用QTcpServer::listen() 监听端口等待client连接
- FortuneServer重写了虚函数 incomingConnection()去接受client连接,并创建线程处理该连接
- FortuneThread是处理client连接的子线程,  在该线程里向client端写入数据结构非常简单。  笔者本来想照着这个架构写个接收client数据的小server,在写的过程中发现了一个很有意思的问题, 且听我慢慢道来。
     不知道大家有没有发现, 其实FortuneServer这个类看起来是QTcpServer类的简单包装,并没有加入新的东西, 笔者就尝试去掉此子类直接使用QTcpServer。设想的程序架构是这样的:
      - 使用QTcpServer监听端口等待client连接
      - 在收到QTcpServer::newConnection信号时调用nextPendingConnection获得socket 连接, 将socket 连接的fd传送给子线程
       - FortuneThread是处理client连接的子线程,得到连接的fd后创建一个QTcpSocket并用QTcpSocket::setSocketDescriptor,这样就可以用QTcpSocket的方法来监控fd的动向了。这里我们用QTcpSocket::waitForReadyRead等待client端发来的数据为了得到与client的连接的socket fd, 调用了QTcpServer::nextPendingConnection()方法获得一个QTcpSocket指针从该指针得到连接的fd, 再将该fd传送给子线程去处理。 看上去与原来的程序没什么区别, 但运行起来却发生了奇怪的问题,那就是有时server的waitForReadyRead返回true时却读不到数据(bytesAvailable() = 0)似乎client发来的数据丢了一样。 真是让人百思不得其解。

问题出了nextPendingConnection上。仔细回想一下我们的程序的架构,在server进程里调用nextPendingConnection获得一个QTcpSocket的指针,将此指针内的fd信息发送给子进程由子进程负责与client通讯。大家再想想QTcpSocket提供了那么多的API包括signal等, 这意味着什么?肯定Qt在底层对fd进行了监控啊,也就是说在我们的程序里出现了两个QTcpSocket分别在两个线程里对同一个fd进行了监控和操作,所以出现一些奇怪的现象也就不算奇怪了。 如果大家尝试对主线程的QTcpSocket进行处理就会发现,所谓“丢失”的数据都可以在这个socket里得到, 即有一部分socket的数据由于线程切换的关系由主线程的socket截获了。为了解决这个问题当然最好的办法还是沿用例子中的架构, 对QTcpServer进行派生,因为在incomingConnection的参数里可以直接得到fd,此时还没有创建QTcpSocket对此fd做任何操作, 是个干净的状态, 不会有任何冲突;另外还有一个办法是在不改变现有程序架构的情况下把这两个QTcpSocket搬到同一个线程里。这样也不会出现两个线程同时访问一个fd的情况。 具体是使用 QObject::moveToThread方法。  需要注意的是文档中对moveToThread有个说明, 有parent的object是不能被移动到其他线程中的,所以还需要把QTcpSocket给setParent(NULL)一下再moveToThread.
    经过实验, 第二种方法也可以很好的工作

QT自带QTcpServer架构分析相关推荐

  1. 带你详解B/S和C/S系统架构分析

    系统架构分析 关于系统架构 1.系统架构包括什么形式? C/S架构 B/S架构 2.C/S架构是什么? -用户在本地安装客户端,通过网络与服务器相互通信. Client/Server(客户端/服务器) ...

  2. pass基础架构分析

    pass基础架构分析 Relay 和 TVM IR,包含一系列优化passes,可提高模型的性能指标,如平均推理,内存占用,或特定设备的功耗.有一套标准优化,及特定机器学习的优化,包括常量折叠,死代码 ...

  3. 转:秒杀系统架构分析与实战

    原文出处: 陶邦仁   欢迎分享原创到伯乐头条 0 系列目录 秒杀系统架构 秒杀系统架构分析与实战 1 秒杀业务分析 正常电子商务流程 (1)查询商品:(2)创建订单:(3)扣减库存:(4)更新订单: ...

  4. 【转】秒杀系统架构分析与实战

    0 系列目录 秒杀系统架构 秒杀系统架构分析与实战 1 秒杀业务分析 正常电子商务流程 (1)查询商品:(2)创建订单:(3)扣减库存:(4)更新订单:(5)付款:(6)卖家发货 秒杀业务的特性 (1 ...

  5. 分布式MySQL数据库TDSQL架构分析

     分布式MySQL数据库TDSQL架构分析 发表于11小时前| 次阅读| 来源程序员电子刊| 0 条评论| 作者雷海林 MySQLTDSQL腾讯架构 width="22" he ...

  6. 各大型网站架构分析收集Z

    1. PlentyOfFish 网站架构学习 http://www.dbanotes.net/arch/plentyoffish_arch.html 采取 Windows 技术路线的 Web 2.0 ...

  7. 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】PowerPC + Linux2.6.25平台下的I2C驱动架构分析

    PowerPC + Linux2.6.25平台下的I2C驱动架构分析 Sailor_forever  sailing_9806#163.com (本原创文章发表于Sailor_forever 的个人b ...

  8. vlc内部运行机制以及架构分析

    VLC架构剖析1. VideoLan简介1.1 videolan组成Videolan有以下两部分组成:VLC:一个最主要的部分,它可以播放各种类型的媒体文件和流 vlc架构剖析 1. VideoLan ...

  9. IOT(30)---庆科物联网平台架构分析

    庆科物联网平台架构分析 之前在介绍国内物联网平台的发展时曾经说到,物联网有两个发展路径,一是云端服务商选择和设备厂商合作推出完整解决方案,如阿里物联.微信硬件等等:二是模组设备厂商选择和云厂商合作并后 ...

最新文章

  1. 分布式主流配置中心介绍:Apollo/Nacos/Spring Cloud Config/Disconf等
  2. aspx mysql类_aspx中的mysql操作类sqldatasource使用示例分享
  3. sulin Python3.6爬虫+Djiago2.0+Mysql --实例demo
  4. LeetCode 1137. 第 N 个泰波那契数
  5. PAT乙类1013 数素数 (20 分)
  6. 数据结构——线性表的C语言实现
  7. camera(18)---双摄像头深度剖析 :双Camera的生态链
  8. 冲刺阶段(二) 第六天
  9. 梦想旅行出席中国互联网大会 做旅游界的技术派
  10. pytorch—torch.tensor.scatter操作解析
  11. 这款工具不用手写一行代码就能做出网站!
  12. 曼哈顿距离与切比雪夫距离的亲密♂关系。
  13. 网页设计配色: 色彩的调和
  14. 小伙伴们,线程生命周期、线程池生命周期别再傻傻分不清楚了!!!
  15. html2canvas实现网页局部存为图片和打印
  16. Carla在Windows上的安装与运行
  17. 【原创】网页全站下载器4.0黑色版,利用爬虫获取所有js、css、img!
  18. 搭建个人网站 保姆级教程(一)云服务器购买以及环境部署
  19. SoftLayer VPS好吗?SoftLayer VPS机房优势有哪些
  20. 【Web前端基础】实验6 CSS样式属性

热门文章

  1. 鸟哥的Linux私房菜(基础篇)- 第二十一章、系统配置工具(网络与打印机)与硬件侦测
  2. 人人都是秋名山车神——Unity实现简化版卡丁车漂移
  3. 待办事项 数据库表设计
  4. 【解题总结】SEERC 2019(Codeforces Gym 102392)
  5. Linux入门学习(六)—— 怎么更改文件的所有者、所属组?以及怎么更改系统创建的默认权限?
  6. dht11传感器c语言程序,数字温湿度传感器DHT11 操作C语言源代码
  7. 文本相似度的那些算法
  8. uCLinux系统分析
  9. linux或者UC/OS
  10. C++11 ThreadPool总结