使用Qt编写客户端的程序的示例或demo较多,但是编写服务器端程序的demo很少。当然,服务器端的程序一般不需要带界面,这点我们可以理解。不过有些时候我们还是需要使用Qt编写一个简单的测试用的服务器代码,这时候该怎么处理呢?

首先,头文件中需要做这两个对象:
QTcpServer * serverListen;
QTcpSocket *serverConnect;

其中,serverListen主要是用来监听的,这是QTcpServer类特有的一些功能。而serverConnect是和客户端程序一样的一个QTcpSocket类的对象,是在我们完成了监听任务之后,将连接交给这个对象,由它来完成数据传输的工作。

.cpp中就开始监听了:
serverListen->listen(QHostAddress::Any,port);
connect(serverListen,SIGNAL(newConnection()),this,SLOT(acceptConnection()));
监听的时候我们可以在指定端口上监听任意ip段的连接。
connect语句中,信号是serverListen中自带的,槽函数是我们自定义的。当有客户端程序连接到来的时候对应的槽函数自动被调用。

槽函数中我们主要做的是:
serverConnect = serverListen->nextPendingConnection();

connect(serverConnect,SIGNAL(readyRead()),this,SLOT(dealMessage()));
connect(serverConnect, SIGNAL(error(QAbstractSocket::SocketError)),
this, SLOT(displayError(QAbstractSocket::SocketError)));
使用nextPendingConnection( )函数将当前的这个网络连接交给我的QTcpSocket对象,从这里开始往后所有网络传输的工作都使用它来完成了,就是说我的QTcpServer类的对象,只完成一个监听的功能就算是光荣完成任务了,之后的事情就不需要再管了。如果只需要做一次连接,甚至可以将其close掉。
第一个connect,信号仍然是自带的,有数据从网络连接上到来的时候该信号自动被发出。槽函数是自定义的,在这个槽函数里面我们读取来自网络连接上的数据。
第二个connect不是必须的。其中信号仍然是自带的,槽函数是我们自定义的,主要是用来处理一些网络传输时的错误,可以弹出一些messagebox来做提示。

在dealMessage槽函数里面,主要做这件事:
if (serverConnect->canReadLine())
QByteArray  infoFromClient = serverConnect->readAll();
来获取网络上传来的数据。
如果想要发送数据,可以这样:
QTextStream os(tcpServer);
os << dataToClient;
tcpServer->close();

很简单吧。
当然,这只是一个基本的收发数据的处理,更复杂的内容则需要加入更多的逻辑来控制了。

如果是Http协议下的server,其实道理也是一样,只是客户端使用http协议传过来的数据的格式可能不大一样,多了一个文件头。
或许可以使用HttpHead之类的类相关的函数去读,但如果只是简单的协议,可以这样:
QString info(infoFromClient);
QStringList tokens(info.split( QRegExp(“[ /r/n][ /r/n]*”)));

if ( tokens[0] == “GET” )
getDeal(serverConnect);

if( tokens[0] == “POST”)
postDeal(serverConnect);

这里就是取个巧,http协议中,如果是post方式,我们把收到的数据按/r/n的方式打散,第一个string肯定要么是GET要么是POST了。这样就知道客户端想要干嘛了。如果协议中还有其它的内容,都可以从我们打散后的list中获取到。

http://love.junzimu.com/archives/2669

使用Qt编写服务器端程序(包括Http传输服务器端)的方法的更多相关文章

  1. linux下对qt编写的程序进行部署

    当我们完成程序设计之后,需要将可执行程序交付客户,而运行环境里面可能是没有相关支持库的,这个时候就涉及到部署的相关问题.对于我们在Linux下基于QT编写的图像处理程序,我们采用linuxdeploy ...

  2. 编写python程序和运行.py文件的方法步骤

    前提:已安装好 Subliume Test 3 且已经添加好python编译系统,已安装好python3.7 一.新建一个文本文档,将后缀名改为.py 二.使用 Subliume Test 3 打开该 ...

  3. MAC 平台 QT编写iphone程序,加载iphone模拟器失败解决办法

    本日这么多年一直做C++开发,最近要做QT项目,被QT做界面的新特性所吸引.QSS QML的确是亮点. 还有一个就是跨平台这方面,自己玩了玩. 用的QT 的开发包是在官网上下载 qt-opensour ...

  4. 关于在Qt里让程序休眠一段时间的方法总结

    出处:http://hanzhaoxin.cnblogs.com/ Qt 为何没有提供 Sleep 论坛上不时见到有人问: Qt 为什么没有提供跨平台的 sleep 函数? 使用平台相关的 Sleep ...

  5. 编写Java程序,通过给定可变参数方法,计算任意给定的多个int类型数据之和

    返回本章节 返回作业目录 需求说明: 通过给定可变参数方法,计算任意给定的多个int类型数据之和. 实现思路: 定义可变形参方法,参数类型是int类型. 定义变量 sum 接受最终的和. 通过 for ...

  6. Windows下用VC与QT编译MPI程序入门

    MPI是信息传递接口的简称,常用来进行进程间.机器间的通信与并行计算.一般而言,MPI都会部署在*nix系统下,在Windows下面直接编译.配置MPI并不容易.本文利用MS提供的编译好的MPI的版本 ...

  7. ubuntu开机自动运行用Qt写的程序

    这里介绍一种在ubuntu系统开机自动运行使用Qt编写的程序的方法.首先要注意要自动运行Qt编的程序,不需要先打开Qt,而是直接运行编译好的与工程名同名的可执行文件即可,比如我要运行的工程为QRDec ...

  8. 使用Qt编写模块化插件式应用程序

    动态链接库技术使软件工程师们兽血沸腾,它使得应用系统(程序)可以以二进制模块的形式灵活地组建起来.比起源码级别的模块化,二进制级别的模块划分使得各模块更加独立,各模块可以分别编译和链接,模块的升级不会 ...

  9. java基础,继承类题目:编写一个Java应用程序,该程序包括3个类:Monkey类、People类和主类 E

    21.编写一个Java应用程序,该程序包括3个类:Monkey类.People类和主类 E.要求: (1) Monkey类中有个构造方法:Monkey (String s),并且有个public vo ...

随机推荐

  1. 关于php-fpm通讯时没有REQUEST_METHOD的问题

    nginx是通过fastcgi协议来和php通讯的!而php-fpm就扮演了这样的角色 fastcgi协议 中文版http://blog.chinaunix.net/uid-380521-id-241 ...

  2. Eclipse-cdt 配合 gdbserver 进行 arm 程序远程调试 上

    做嵌入式Linux开发也不用再羡慕windows程序员VS集成开发环境的强大,我们同样能够搭建出给力的IDE. 今天在这里记录一下我使用Eclipse-cdt,gdb,gdbserver搭建远程arm ...

  3. EBS查询用户客户化的文件配置

    select pro.profile_option_name, pro.user_profile_option_name, lev.level_type type, --lev.level_code, ...

  4. 关于Microsoft app下同义词的整理

    Windows os 以下词表达的是同一个概念 windows store app windows metro app windows modern app windows runtime app w ...

  5. HTML5学习笔记简明版 目录索引

    http://www.cnblogs.com/TomXu/archive/2011/12/06/2277499.html

  6. Android实现Live Photos 加源代码

    在Android手机上实现类似于iphone中的LivePhoto的功能 源代码分享 github:https://github.com/amazingyyc/DeepRed 代码说明: 1.改变视频 ...

  7. web前端之 CSS引入第三方插件

    引入第三方图标插件 - fontawesome 官网地址:http://fontawesome.io/ 1.下载图标插件包 下载地址:https://codeload.github.com/FortA ...

  8. Java之Static静态修饰符详解

    Java之Static静态修饰符详解 Java之Static静态修饰符详解 一.特点 1.随着类的加载而加载,随着类的消失而消失,生命周期最长 2.优先于对象存在 3.被所有类的对象共享 4.可以直接 ...

  9. Linux正則表達式-反复出现的字符

    星号(*)元字符表示它前面的正則表達式能够出现零次或多次.也就是说,假设它改动了单个字符.那么该字符能够在那里也能够不在那里,而且假设它在那里,那可能会不止出现一个.能够使用星号元字符匹配出如今引號中 ...

  10. Hadoop集群启动之后,datanode节点未正常启动的问题

    Hadoop集群启动之后,用JPS命令查看进程发现datanode节点上,只有TaskTracker进程.如下图所示 master的进程: 两个slave的节点进程 发现salve节点上竟然没有dat ...