使用gSoap做一个简单的CS系统
首先介绍一下gSoap,这是一个非常厉害的网络库,封装程度非常高而且跨平台。
支持SSL链接,数据格式为XML。
介绍地址:
http://sourceforge.net/projects/gsoap2/
近段时间是有项目需求,所以接触到了这个库。
自己摸索了一下,发现用这个库开发真的是非常方便。
所以,强烈推荐各位使用gSoap开发。
使用gSoap的大致步骤是:
1.下载gSoap库
2.制定自己需要的函数
3.使用soapcpp2导出需要的源文件
4.添加这些源文件和库中的2个文件到工程
5.简单的封装
6.使用
~~~~~正文分割线~~~~~
1.下载gSoap库
可以到上面给出的介绍地址中下载。
2.制定自己需要的函数
更具具体需求,写出接口函数。
要求:
1.函数返回值类型是int;
2.函数的最后一个参数,用于服务器返回数据给客户端,需要是一个指针或者引用。
3.其他参数可自定义,用于客户端传数据给服务器。
我的头文件的内容是
- #ifndef __gSoapApi_h__
- #define __gSoapApi_h__
- int dataStream(std::string name, double data, int &returnFlag);
- #endif//__gSoapApi_h__
3.使用soapcpp2导出需要的源文件
在下载的源码包的 gsoap2-8/gsoap/bin/macosx 这个目录下,可以找到我们需要的soapcpp2工具。
使用方法(在我的电脑上,具体路径请根据实际情况修改):
1.切换到刚刚写好的头文件的目录
/Users/Jason/Desktop/gSoapFoundation
2.使用soapcpp2工具
/Users/Jason/Downloads/gsoap-2.8/gsoap/bin/macosx/soapcpp2 myApi.h
然后就可以看到在目录下生成了以下8个文件
soap.nsmap:一定要用一个.cpp文件include,不然编译报错(我电脑上是这样的)
soapC.cpp:服务器和客户端都需要
soapClient.cpp:客户端需要
soapClientLib.cpp:可以不用
soapH.h:一个头文件
soapServer.cpp:服务器需要
soapServerLib.cpp:可以不用
soapStub.h:一个头文件
4.添加这些源文件和库中的2个文件到工程
注:stdsoap2.h 和 stdsoap2.cpp 都可以在源码包的 gsoap-2.8/gsoap 目录下找到。
对于客户端:
soapH.h、soapStub.h、soapClient.cpp、soapC.cpp、stdsoap2.cpp、soap.nsmap
对于服务器:
soapH.h、soapStub.h、soapServer.cpp、soapC.cpp、stdsoap2.cpp、soap.nsmap
对于我的客户端项目的pro文件,内容是:
- #-------------------------------------------------
- #
- # Project created by QtCreator 2015-08-14T15:22:03
- #
- #-------------------------------------------------
- QT += core gui
- greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
- TARGET = gSoapClient
- TEMPLATE = app
- SOURCES += main.cpp \
- ../gSoapFoundation/soapClient.cpp \
- ../gSoapFoundation/stdsoap2.cpp \
- ../gSoapFoundation/soapC.cpp \
- client.cpp
- HEADERS += \
- client.h
对于我的服务器项目的pro文件,内容是:
- #-------------------------------------------------
- #
- # Project created by QtCreator 2015-08-14T15:22:37
- #
- #-------------------------------------------------
- QT += core gui
- greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
- TARGET = gSoapServer
- TEMPLATE = app
- SOURCES += main.cpp \
- ../gSoapFoundation/soapServer.cpp \
- ../gSoapFoundation/stdsoap2.cpp \
- server.cpp \
- ../gSoapFoundation/soapC.cpp
- HEADERS += \
- server.h
5.简单的封装
在客户端,发送数据的借口,大概是这样的:
- bool sendDatStream(const char *server, std::string name, double data, int &returnFlag)
- {
- soap add_soap;
- soap_init(&add_soap);
- soap_call_dataStream(&add_soap, server, "", name, data, returnFlag);
- if(add_soap.error)
- {
- qDebug("soap error:%d,%s,%s", add_soap.error, *soap_faultcode(&add_soap), *soap_faultstring(&add_soap) );
- soap_end(&add_soap);
- return false;
- }
- soap_end(&add_soap);
- return true;
- }
在服务器,建立一个服务器和处理客户端发来数据的借口,大概是这样的:
- void startServer(const char *address, int port)
- {
- soap recieveSoap;
- soap_init(&recieveSoap);
- qDebug() << "Soap bind return:" << soap_bind(&recieveSoap, address, port, 100);
- while(true)
- {
- int s = soap_accept(&recieveSoap);
- if (s < 0)
- {
- soap_print_fault(&recieveSoap, stderr);
- qDebug() << "error";
- exit(-1);
- }
- qDebug() << "Socket connection successful: slave socket =" << s;
- soap_serve(&recieveSoap);
- soap_end(&recieveSoap);
- }
- }
- int dataStream(soap *, std::string name, double data, int &returnFlag)
- {
- qDebug() << "dataStream" << name.c_str() << data;
- returnFlag = 123456;
- return 0;
- }
6.使用
客户端:
- int returnFlag = 0;
- qDebug() << sendDatStream("127.0.0.1:23410", "key", 3.1415, returnFlag);
- qDebug() << returnFlag;
服务器:
- startServer("127.0.0.1", 23410);
我也写了一个示例,可以到这里下载
http://download.csdn.net/detail/wsj18808050/9012831
http://blog.csdn.net/wsj18808050/article/details/47706715
使用gSoap做一个简单的CS系统的更多相关文章
- 一个简单的CS系统打包过程图文版
一个简单的CS系统打包过程图文版 1. 打包内容 1.1. 此次打包的要求和特点 主工程是一个CS系统: 此CS系统运行的先决条件是要有.Net Framework 3.5: 主工程安装完成 ...
- Linux内核分析第三周学习总结:构造一个简单的Linux系统MenuOS
韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.Linux内 ...
- 20135202闫佳歆--week3 构造一个简单的Linux系统MenuOs--学习笔记
此为个人学习笔记存档 week 3 构造一个简单的Linux系统MenuOs 复习: 计算机有三个法宝:存储程序计算机,函数调用堆栈,中断 操作系统有两把剑: 1.中断上下文的切换,保存现场和恢复现场 ...
- 20135220谈愈敏Blog3_构造一个简单的Linux系统MenuOS
构造一个简单的Linux系统MenuOS 谈愈敏 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1 ...
- 程序猿修仙之路--数据结构之你是否真的懂数组? c#socket TCP同步网络通信 用lambda表达式树替代反射 ASP.NET MVC如何做一个简单的非法登录拦截
程序猿修仙之路--数据结构之你是否真的懂数组? 数据结构 但凡IT江湖侠士,算法与数据结构为必修之课.早有前辈已经明确指出:程序=算法+数据结构 .要想在之后的江湖历练中通关,数据结构必不可少. ...
- 使用React并做一个简单的to-do-list
1. 前言 说到React,我从一年之前就开始试着了解并且看了相关的入门教程,而且还买过一本<React:引领未来的用户界面开发框架 >拜读.React的轻量组件化的思想及其virtual ...
- 使用Multiplayer Networking做一个简单的多人游戏例子-3/3(Unity3D开发之二十七)
使用Multiplayer Networking做一个简单的多人游戏例子-1/3 使用Multiplayer Networking做一个简单的多人游戏例子-2/3 使用Multiplayer Netw ...
- 使用Multiplayer Networking做一个简单的多人游戏例子-1/3(Unity3D开发之二十五)
猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/51006463 ...
- HTTP lab01 做一个简单的测试用 web页面
做一个简单的测试用 web页面 1.安装httpd服务 yum install httpd 安装完httpd服务后,系统就自动生成了/var/www/html目录 创建一个 ...
随机推荐
- Qt5 文本编辑
[应用场景]:在编辑框中输入一段文字,用鼠标选取文字,修改工具栏上的字体.字号大小.加粗.斜体等属性,选取的文字即发生相应的变化. 一. 任何一个文本编辑器的程序都要用到QTextEdit ...
- BZOJ 4011: [HNOI2015]落忆枫音( dp )
DAG上有个环, 先按DAG计数(所有节点入度的乘积), 然后再减去按拓扑序dp求出的不合法方案数(形成环的方案数). ---------------------------------------- ...
- jquery实现带左右箭头和数字焦点的图片轮播手写代码
以前图片轮播经常用网上的插件,然后想说自己也要认真看看,一步一步弄明白,所以就自己研究写了个图片轮播的代码,我自己觉得还算是挺简单的.如有改进的地方,欢迎你能帮我指出,共同进步. (ps:博客园如何上 ...
- Github 常用命令
小记一些Github常用命令 : 在一个项目中... 假如要修补问题追踪系统上的 #53 问题.顺带说明下,Git 并不同任何特定的问题追踪系统打交道.这里为了说明要解决的问题,把新建的分支取名为 i ...
- TCP粘包拆包问题
阿π 专注于网络协议,系统底层,服务器软件 C++博客 | 首页 | 发新随笔 | 发新文章 | | | 管理 Socket粘包问题 这两天看csdn有一些关于socket粘包,socket缓冲区设置 ...
- USB OTG学习
1. 概要 OTG设备使用插头中的ID引脚来区分A/B Device,ID接地被称作为A-Device,为连接时候的USB Host,A-Device始终为总线提供电力,ID悬空被称作为B-Devic ...
- 本地化SilverLight应用程序(多语言支持)
原文 http://www.cnblogs.com/seaworm/archive/2010/11/30/1892325.html 利用资源文件(Resources File)使SilverLight ...
- poj 1860 (Bellman_Ford判断正环)
题意:给出n种货币,m中交换关系,给出两种货币汇率和手续费,求能不能通过货币间的兑换使财富增加. 用Bellman_Ford 求出是否有正环,如果有的话就可以无限水松弛,财富可以无限增加. #incl ...
- JavaScript js生成GUID
function generateUUID(){ var d = new Date().getTime(); var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxx ...
- 使用JS控制struts的日期控件datetimepicker
功能需求:页面主要有两个日历框,一个是当前日期,一个是去年同期,要求当用户改变当前日期时,同步修改去年同期为当前日期-1年. 当时刚接触到需求的第一时间想到的就是为< sx:datetimepi ...