使用Qt编写服务器端程序(包括Http传输服务器端)的方法
使用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传输服务器端)的方法的更多相关文章
- linux下对qt编写的程序进行部署
当我们完成程序设计之后,需要将可执行程序交付客户,而运行环境里面可能是没有相关支持库的,这个时候就涉及到部署的相关问题.对于我们在Linux下基于QT编写的图像处理程序,我们采用linuxdeploy ...
- 编写python程序和运行.py文件的方法步骤
前提:已安装好 Subliume Test 3 且已经添加好python编译系统,已安装好python3.7 一.新建一个文本文档,将后缀名改为.py 二.使用 Subliume Test 3 打开该 ...
- MAC 平台 QT编写iphone程序,加载iphone模拟器失败解决办法
本日这么多年一直做C++开发,最近要做QT项目,被QT做界面的新特性所吸引.QSS QML的确是亮点. 还有一个就是跨平台这方面,自己玩了玩. 用的QT 的开发包是在官网上下载 qt-opensour ...
- 关于在Qt里让程序休眠一段时间的方法总结
出处:http://hanzhaoxin.cnblogs.com/ Qt 为何没有提供 Sleep 论坛上不时见到有人问: Qt 为什么没有提供跨平台的 sleep 函数? 使用平台相关的 Sleep ...
- 编写Java程序,通过给定可变参数方法,计算任意给定的多个int类型数据之和
返回本章节 返回作业目录 需求说明: 通过给定可变参数方法,计算任意给定的多个int类型数据之和. 实现思路: 定义可变形参方法,参数类型是int类型. 定义变量 sum 接受最终的和. 通过 for ...
- Windows下用VC与QT编译MPI程序入门
MPI是信息传递接口的简称,常用来进行进程间.机器间的通信与并行计算.一般而言,MPI都会部署在*nix系统下,在Windows下面直接编译.配置MPI并不容易.本文利用MS提供的编译好的MPI的版本 ...
- ubuntu开机自动运行用Qt写的程序
这里介绍一种在ubuntu系统开机自动运行使用Qt编写的程序的方法.首先要注意要自动运行Qt编的程序,不需要先打开Qt,而是直接运行编译好的与工程名同名的可执行文件即可,比如我要运行的工程为QRDec ...
- 使用Qt编写模块化插件式应用程序
动态链接库技术使软件工程师们兽血沸腾,它使得应用系统(程序)可以以二进制模块的形式灵活地组建起来.比起源码级别的模块化,二进制级别的模块划分使得各模块更加独立,各模块可以分别编译和链接,模块的升级不会 ...
- java基础,继承类题目:编写一个Java应用程序,该程序包括3个类:Monkey类、People类和主类 E
21.编写一个Java应用程序,该程序包括3个类:Monkey类.People类和主类 E.要求: (1) Monkey类中有个构造方法:Monkey (String s),并且有个public vo ...
随机推荐
- codechef Prime Distance On Tree(树分治+FFT)
题目链接:http://www.codechef.com/problems/PRIMEDST/ 题意:给出一棵树,边长度都是1.每次任意取出两个点(u,v),他们之间的长度为素数的概率为多大? 树分治 ...
- ActionBar Fragment运用最佳实践
ActionBar Fragment运用最佳实践
- 《Algorithms 4th Edition》读书笔记——3.1 符号表(Elementary Symbol Tables)-Ⅰ
3.1符号表 符号表最主要的目的就是将一个键和一个值联系起来.用例能够将一个键值对插入符号表并希望在之后能够从符号表的所有键值对中按照键值姐找到对应的值.要实现符号表,我们首先要定义其背后的数据结构, ...
- 【shell】构造并遍历二位数组的一种用法
参考shell数组的部分操作用法,实现了构造和遍历二维数组的一种方式,具体如下: #数组元素以空格分割 sites=("www.a.com www.b.com www.c.com www.d ...
- LitJson处理Json
LitJSON是一个.NET平台下处理JSON格式数据的类库,小巧.快速.它的源代码使用C#编写,可以通过任何.Net平台上的语言进行调用,目前最新版本为LitJSON 0.9. 下载地址: http ...
- A星算法
没有采用二叉堆算法优化, 学习了几天终于搞除了一个demo, 这个列子如果点击按钮生成的方块大小不正确,可以先设置下预设调成相应的大小 只能上下左右走 using UnityEngine; usi ...
- 一个简单的面试题 很多人也会懵 i++ 和++i的区别
以下分别输出i的值分别为多少 NSInteger i = 0 ; NSLog(@"%ld",i++); NSLog(@"%ld",i++); NSLog(@&q ...
- php 依据字符串生成相应数组方法
php 依据字符串生成相应数组方法 比如: <?php $config = array( 'project|page|index' => 'content', 'project|page| ...
- magic Ajax使用以及注意事项
以下是引用片段:一.概述 现在Ajax技术正如火如荼的在Internet上发展着.而面对我们之前开发的ASP.NET1.1的Web项目,类似于下拉框等联动也需要啪啪啪的不断刷新,的确影响到了用户 ...
- C# 获取配置文件节点值
<?xml version="1.0" encoding="utf-8" ?><configuration> <appSetti ...