gsoap实现C#(Windows窗体应用程序)客户端调用C++服务器端

gsoap实现C#(Windows窗体应用程序)客户端调用C++服务器端图文教程

一、环境

操作系统:win7

gsoap版本:2.8.66  下载链接:https://sourceforge.net/projects/gsoap2/

C++/C#开发环境:Visual Studio 2013

二、实现过程

这里实现一个小小的加减乘除计算器吧~

编写接口文件

1、编写头文件calc.h。建一个文件夹program(可以在桌面上建,等一下利用命令窗口的时候路径可以少一些),可以先建一个txt文档后边改后缀名,也可以直接利用VS生成头文件,按自己的习惯来。头文件的内容如下:

//gsoap ns service name: calc
//gsoap ns service protocol: SOAP  
//gsoap ns service style: rpc
//gsoap ns service namespace: http://localhost/calc.wsdl
//gsoap ns service location: http://localhost
//gsoap ns service encoding: encoded

//gsoap ns schema namespace: urn:calc

int ns__add( int num1, int num2, int* sum );
int ns__sub(int num1, int num2, int* sum);
int ns__mul(int num1, int num2, int* sum);
int ns__div(int num1, int num2, int* sum);

2、生成服务端和客户端需要的文件。下载gsoap之后解压,从gsoap>bin>win32里面复制soapcpp2.exe到上一步建的program文件夹.打开cmd命令行,切换目录到“calc.h”文件所在目录,执行命令:soapcpp2.exe calc.h




服务端配置

3、执行完上一步命令之后,会发现program文件夹里面多出一些文件。这时新建一个Win32控制台应用程序,命名program_calc(此处自己命名),将“为解决方案创建目录”前边的方框打钩,此时项目中会自动生成一个program_calc.cpp源文件。将program文件夹里面的calc.h,calc.nsmap,soapC.cpp , soapH.h , soapServer.cpp , soapStub.h 六个文件拷贝到program_calc项目中,并且从gsoap文件夹里面复制stdsoap2.cpp和stdsoap2.h两个文件到program_calc项目中。


  

4、右键项目名program_calc>添加>现有项,将第3步中复制的文件都添加进去。


修改program_calc.cpp内容如下:

// program_calc.cpp : 定义控制台应用程序的入口点。
//
#include "add.h"
#include "calc.nsmap"
int main(int argc, char* argv[])
{
int m, s;
/* master and slave sockets */
struct soap calc_soap;
soap_init(&calc_soap);
//soap_set_namespaces(&calc_soap, calc_namespaces);    
if (argc < 2)
{
printf("usage: %s <server_port> \n", argv[0]);
exit(1);
}
else
{
m = soap_bind(&calc_soap, NULL, atoi(argv[1]), 100);
if (m < 0)
{
soap_print_fault(&calc_soap, stderr);
exit(-1);
}
fprintf(stderr, "Socket connection successful: master socket = %d/n", m);
for (;;)
{
s = soap_accept(&calc_soap);
if (s < 0)
{
soap_print_fault(&calc_soap, stderr);
exit(-1);
}
fprintf(stderr, "Socket connection successful: slave socket = %d/n", s);
soap_serve(&calc_soap);//该句说明该server的服务            
soap_end(&calc_soap);
}
return 0;
}
}

//server端的实现函数与calcmethod.h中声明的函数相同,但是多了一个当前的soap连接的参数
int ns__add(struct soap *add_soap, int num1, int num2, int *sum)
{
*sum = num1 + num2;
return SOAP_OK;
}
int ns__sub(struct soap *add_soap, int num1, int num2, int *sum)
{
*sum = num1 - num2;
return SOAP_OK;
}
int ns__mul(struct soap *add_soap, int num1, int num2, int *sum)
{
*sum = num1 * num2;
return SOAP_OK;
}
int ns__div(struct soap *add_soap, int num1, int num2, int *sum)
{
*sum = num1 / num2;
return SOAP_OK;
}

5、编译现有program_calc项目,打开cmd命令行,进入program_calc>Debug目录,执行program_calc.exe 1234。此处的1234为端口号,是自己给定的,只要没有占用就好。在跳出的安全警报中点击允许访问。


打开IE浏览器,搜索框输入http://192.168.1.103:1234/,如下图,则说明服务端配置成功。

客户端配置

6、新建C#窗体应用程序,命名program_client,先绘制如图表格。


7、添加服务引用。右键项目下面的引用,选择“添加服务引用”,将第2步生成calc.wsdl文件的路径填入地址栏,不要忘了后边加上calc.wsdl,点击转到,可以查找到一个服务,命名空间修改为calc(此处可以自己定义),点击确定。



8、在program函数中,定义一个calc.XXXXclient类的实例sample,如:

calc.calcPortTypeClient sample = new calc.calcPortTypeClient("calc", "http://192.168.1.103:1234");其中calc为接口服务名,与头文件一致(第1行),"http://192.168.1.103:1234"为IP地址+端口号,与前边服务端执行的一致。


9、在"add","sub","mul","div"按钮下面添加内容:

calc.calcPortTypeClient sample = new calc.calcPortTypeClient("calc", "http://192.168.1.103:1234");

           textBox3.Text = sample.add(int.Parse(textBox1.Text), int.Parse(textBox2.Text)).ToString();


四个按钮内容很像,区别只在于调用函数位置(此处加减乘除的数字类型都为int,除法其实会出问题,实际应用时要根据实际类型来定义,此处只是简单的示意)。重新生成解决方案,好啦~然后就可以运行了,注意运行之前要打开主服务(服务端要运行,第5步内容)


一个小小的跨平台运用就完成了~奋斗





展开阅读全文

没有更多推荐了,返回首页