使用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. hdu 1811 Rank of Tetris

    http://acm.hdu.edu.cn/showproblem.php?pid=1811 拓扑排序和并差集 #include <cstdio> #include <queue&g ...

  2. 暴力破解UltraEdit v21 无需注册

    一.复制一份UltraEdit安装目录中的主程序uedit32.exe,到任意目录,用UltraEdit打开复制的uedit32.exe文件. 二.修改以下内容 原来:00094750h: BE DC ...

  3. Visual studio 使用正则表达查找替换

    原文 http://www.cnblogs.com/shineqiujuan/archive/2012/07/04/2575535.html 正则表达式是查找和替换文本模式的一种简洁而灵活的表示法.  ...

  4. Poj3484-Showstopper(二分脑洞题)

    Description Data-mining huge data sets can be a painful and long lasting process if we are not aware ...

  5. linux group

    groups 查看当前登录用户的组内成员 groups gliethttp 查看gliethttp用户所在的组,以及组内成员 whoami 查看当前登录用户名   /etc/group文件包含所有组 ...

  6. 最简单的XML转数组

    /** * 最简单的XML转数组 * @param string $xmlstring XML字符串 * @return array XML数组 */ function simplest_xml_to ...

  7. python爬爬(网友提供学习)

    import urllib2,urllib,os,re def ZZ(url): pathw=os.getcwd() #图片和标题目录 imagetitleregion=r'<div class ...

  8. python高级编程之选择好名称:完2

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #分解代码 #小就是美,这也适用所有级别的代码,当一个函数,类或者一 ...

  9. 集成支付宝SDK遇到的坑

    一.首先我先把集成过程说一下.小编想说的话:支付宝是我做支付中觉得坑最多的一个,各种编译不过,各种出问题. 废话不多说,进入主题:1.首先当前是下载官方SDK啦,当前你也可以通过cocopods进行导 ...

  10. .net 4.5 新特性 async await 一般处理程序实例

    using System; using System.Collections.Generic; using System.Linq; using System.Threading; using Sys ...