使用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. keil c51 本變數型態(Variable Type)

    本變數型態(Variable Type): 類 別 符號位元 位元組(bytes) 表 示 法 數 值 範 圍 整 數 有 2 int(short) -32768~0~>32767 4 long ...

  2. 《Programming WPF》翻译 第8章 1.动画基础

    原文:<Programming WPF>翻译 第8章 1.动画基础 动画包括在一段时间内改变用户界面的某些可见的特征,如它的大小.位置或颜色.你可以做到这一点,非常困难的通过创建一个tim ...

  3. jQuery.trim(str)

    描述: 去掉字符串起始和结尾的空格. jQuery 代码: $.trim(" hello, how are you? "); 结果: "hello, how are yo ...

  4. 第02讲- Android开发环境

    第02讲Android开发环境 需要下载的软件: JDK(JavaDevelopment Kit) Eclipse AndroidSDK(SoftwareDevelopmentKit) ADT(And ...

  5. 《Java程序员面试笔试宝典》之 instanceof有什么作用

    instanceof是Java语言中的一个二元运算符,它的作用是判断一个引用类型的变量所指向的对象是否是一个类(或接口.抽象类.父类)的实例,即它左边的对象是否是它右边的类的实例,返回boolean类 ...

  6. 【转】Android中自动连接到指定SSID的Wi-Fi

    最近在做一个项目,其中涉及到一块“自动连接已存在的wifi热点”的功能,在网上查阅了大量资料,五花八门,但其中一些说的很简单,即不能实现傻瓜式的拿来就用,有些说的很详细,但其中不乏些许错误造成功能无法 ...

  7. Spring AOP应用实例demo

    AOP(Aspect-Oriented Programming.面向方面编程).能够说是OOP(Object-OrientedPrograming.面向对象编程)的补充和完好.OOP引入封装.继承和多 ...

  8. 【桌面虚拟化】之三 Persistent vs NonP

    作者:范军 (Frank Fan) 新浪微博:@frankfan7 在[桌面虚拟化]之二类型及案例中我们探讨了桌面虚拟化的两种架构,HostedVirtual Desktop (VDI) 和 Publ ...

  9. bash的元字符(下)

    ` "Esc"键正下方键,替换命令 PS1=`command` {} 在当前shell中运行命令 {command1;command2} | 创建命令间的管道 command1 | ...

  10. Swift 全功能的绘图板开发

    要做一个全功能的绘图板,至少要支持以下这些功能: 支持铅笔绘图(画点) 支持画直线 支持一些简单的图形(矩形.圆形等) 做一个真正的橡皮擦 能设置画笔的粗细 能设置画笔的颜色 能设置背景色或者背景图 ...