gsoap的c++ server和java client实现

简介: 最近项目需要建立向客户方已有系统推送类似于RSS信息的富文本信息,并推送信息待定,由于我们本身项目是C++的,客户系统是java的,又要满足到推送信息可定制可扩展,并必要时可web查看,思量之下采用gsoap轻量级webserver库开发。

最近项目需要建立向客户方已有系统推送类似于RSS信息的富文本信息,并推送信息待定,由于我们本身项目是C++的,客户系统是java的,又要满足到推送信息可定制可扩展,并必要时可web查看,思量之下采用gsoap轻量级webserver库开发。

现用经典的hello项目进行技术可行性验证,同时记录下来,供日后遗忘时参考。

1)资料准备:

下载:

gsoap_2.8.22.zip,axis2-1.7.5-bin.zip,apache-ant-1.9.7-bin.zip,jdk-8u65-windows-x64.exe,eclipse_cn.zip,vs2015.ent_chs.iso

安装:

安装eclipse,vs2015,JDK

将gsoap、axis2、apache-ant解压到指定目录

配置编译环境:

JAVA_HOME=C:\software\Java\jdk1.8.0_65

AXIS2_HOME=E:\tools\gsoap\axis2-1.7.5

ANT_HOME=E:\tools\gsoap\apache-ant-1.9.7

GSOAP_HOME=E:\tools\gsoap\gsoap-2.8\gsoap

CLASSPATH=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar

;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;%AXIS2_HOME%\bin;%ANT_HOME%\bin;%GSOAP_HOME%\bin\win32

加入PATH环境变量

2)编译实现

gsoap生成:

将gsoap-2.8\gsoap\samples\hello\hello.h拷贝到指定目录(本人建立E:\work\test\gsoap\hello目录)

建立hello.bat文件,编译命令:

E:\tools\gsoap\gsoap-2.8\gsoap\bin\win32\soapcpp2.exe -S -IE:\tools\gsoap\gsoap-2.8\gsoap\import hello.h

备注:

(我给出了详细地址,如果设置了环境变量可直接环境变量,可以:

%GSOAP_HOME%\bin\win32\soapcpp2.exe -S -I%GSOAP_HOME%\import hello.h


在命令行进入该目录(E:\work\test\gsoap\hello)运行该文件(hello.bat),将生成一系列文件

将E:\tools\gsoap\gsoap-2.8\gsoap目下的

stdsoap2.h、stdsoap2.cpp(或stdsoap2.c)

拷贝到当前目录(E:\work\test\gsoap\hello)

服务端开发:

打开vs2015,在该目录(E:\work\test\gsoap\hello)下建立server_gsoap工程,并添加Additional Include目录..\..

创建helloserver.cpp文件,加入

#include "soapH.h"
#include "h.nsmap"
#include "stdsoap2.h"

int http_get(struct soap *_soap)
{
    soap_response(_soap,SOAP_HTML);
    soap_send(_soap,"<HTML>Hello World For Gsoap To Java!</HTML>");
    soap_end_send(_soap);
    return SOAP_OK;
};

int main()
{
    struct soap add_soap;
    soap_init(&add_soap);
    int m = soap_bind(&add_soap, NULL, 4567, 100);
    if (m < 0)
    {
        soap_print_fault(&add_soap, stderr);
        exit(-1);
    }
    add_soap.fget=http_get;
    add_soap.send_timeout=3;
    add_soap.recv_timeout=3;
    fprintf(stderr, "Socket connection successful: master socket = %d\n", m);
    for ( ; ; )
    {
        int s = soap_accept(&add_soap);
        if (s < 0)
        {
            soap_print_fault(&add_soap, stderr);
            exit(-1);
        }
        fprintf(stderr, "Socket connection successful: slave socket = %d\n", s);
            
        soap_serve(&add_soap);//该句说明该server的服务
        soap_end(&add_soap);
    }
    return 0;
    //return soap_serve(soap_new());
}

int h__hello(struct soap *soap, char *&s)
{
    s = soap_strdup(soap, "Hello World For Gsoap To Java!");
    return SOAP_OK;
}

将目录(E:\work\test\gsoap\hello)的

soapH.h、soapStub.h、stdsoap2.h、soapC.cpp、soapServer.cpp、stdsoap2.cpp

加入工程,编译,生成我们的服务

客户端开发:

在目录(E:\work\test\gsoap\hello)下建立子目录client_java,运行命令

wsdl2java -uri .\h.wsdl -p com.client -o .\client_java

会在client_java目录生成src包及build.xml

然后进入子目录client_java,运行命令

ant

将根据client_java生成build包

打开eclipse.exe,新建立java project,选择路径E:\work\test\gsoap\hello\client_java,加载工程文件

在Project->Properties->Java Build Path->Libraries中Add Library...,选择User Libraty,命名axis2,

路径设置E:\tools\gsoap\axis2-1.7.5\lib,并将该路径下的.jar添加进来。

建立/src/com/client/HelloClient.java文件,

内容类似:

package com.client;

// filename: HelloClient.java

import javax.xml.namespace.QName;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;

import  com.client.ServiceStub;

public class HelloClient {
    public static void main(String[] args) throws Exception {
        ServiceStub stub = new ServiceStub("http://127.0.0.1:4567");
        ServiceStub.Hello req = new ServiceStub.Hello();
        ServiceStub.HelloResponse resp = null;
       
        resp = stub.hello(req);
       
        System.out.println("resp = "+resp.getParam1());
    }
}

测试:

启动服务端,运行客户端


测试成功!




目录
相关文章
|
2月前
|
NoSQL 网络协议 Linux
Redis的实现一:c、c++的网络通信编程技术,先实现server和client的通信
本文介绍了使用C/C++进行网络通信编程的基础知识,包括创建socket、设置套接字选项、绑定地址、监听连接以及循环接受和处理客户端请求的基本步骤。
58 6
|
16天前
|
Java Android开发 C++
Java和C++
Java和C++
34 15
WK
|
1月前
|
安全 Java 编译器
C++和Java哪个更好用
C++和Java各具优势,选择取决于项目需求、开发者偏好及目标平台特性。C++性能出色,适合游戏、实时系统等;Java平台独立性强,适合跨平台、安全敏感应用。C++提供硬件访问和灵活编程范式,Java有自动内存管理和丰富库支持。两者各有千秋,需根据具体需求选择。
WK
32 1
|
2月前
|
IDE Java 程序员
C++ 程序员的 Java 指南
一个 C++ 程序员自己总结的 Java 学习中应该注意的点。
25 5
WK
|
1月前
|
开发框架 移动开发 Java
C++和Java哪个更适合开发移动应用
本文对比了C++和Java在移动应用开发中的优劣,从市场需求、学习难度、开发效率、跨平台性和应用领域等方面进行了详细分析。Java在Android开发中占据优势,而C++则适合对性能要求较高的场景。选择应根据具体需求和个人偏好综合考虑。
WK
55 0
WK
|
1月前
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
86 0
|
2月前
|
缓存 并行计算 Java
C++矢量运算与java矢量运算
本文探讨了C++和Java中的矢量运算与标量运算的性能比较,解释了矢量运算的原理和为什么它比标量运算快,包括并行性、数据局部性、指令优化和数据重用等优势。文章还提供了C++和Java的矢量运算示例代码,并展示了运行结果,以证明矢量运算在处理大量数据时的性能优势。
25 0
C++矢量运算与java矢量运算
|
2月前
|
Java
用java实现Client和Server之间的互相通信
本文介绍了如何使用Java实现客户端和服务器之间的通信,包括服务器端创建ServerSocket、接受客户端连接、读取和发送消息,以及客户端创建Socket连接、发送和接收消息的完整过程。
63 0
用java实现Client和Server之间的互相通信
|
3月前
|
Java API Nacos
Caused by: java.lang.IllegalStateException: No Feign Client for loadBalancing defined. Did you forge
Caused by: java.lang.IllegalStateException: No Feign Client for loadBalancing defined. Did you forge
197 2
|
3月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
166 1
下一篇
DataWorks