C++ ActiveMQ实现通讯

【MQTT协议】使用c++实现mqtt协议(Mosquitto源码编译) MQTT(Message Queuing Telemetry Transport)是一种轻量级的、基于发布/订阅模式的消息传输协议,其最初由IBM开发,现已成为OASIS标准。MQTT协议常用于物联网领域,特别是在传输低带宽、高延迟、不稳定网络条件下的数据,例如传感器数据和遥测数据等。MQTT协议的优点:轻量级:MQTT协议的设计十分轻量级,其开销比较小,传输的数据包大小也比较小,这使得MQTT协议非常适合在低带宽、高延迟的网络环境下使用。 阅读详情

C++ ActiveMQ实现通讯完整版

简介

该博客收到一些反应,说教程不够明细操作的时候怎么都不行,特今日(2017年8月29日17点)进行博客修改,并将新demo一起附上,建议看看博客下面的“需要注意的地方”后在来编译demo!

所需的关联lib,dll,还有新实例demo都在下面这个附件里面,我的demo是用的vs2008编辑器。

新附件下载地址(如失效请联系):http://pan.baidu.com/s/1eS1pzkm

也可以直接参考下面的代码

编译的是时候需要导入activemq-cpp源码,可以去官网下载

http://activemq.apache.org/cms/download.html

activemq-cpp.lib activemq-cpp.dll也是需要编译的,嫌编译麻烦,可以直接使用附件里面编译好的

apr依赖下载地址:http://apr.apache.org/download.cgi 

apr-1.6.2-win32-src.zip,apr-iconv-1.2.1-win32-src-r2.zip, apr-util-1.6.0-win32-src.zip

一共是三个,下载后需要编译出lib,dll ,嫌编译麻烦,可以直接使用附件里面编译好的

一.生产者头文件定义


#include "stdafx.h"
#include <decaf/util/concurrent/CountDownLatch.h>
#include <decaf/lang/Long.h>
#include <decaf/util/Date.h>
#include <activemq/core/ActiveMQConnectionFactory.h>
#include <activemq/util/Config.h>
#include <activemq/library/ActiveMQCPP.h>
#include <activemq/transport/DefaultTransportListener.h>
#include <cms/ExceptionListener.h>
#include <cms/Connection.h>
#include <cms/Session.h>
#include <cms/TextMessage.h>
#include <cms/BytesMessage.h>
#include <cms/MapMessage.h>
#include <cms/ExceptionListener.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <memory>

using namespace activemq;
using namespace activemq::core;
using namespace decaf;
using namespace decaf::lang;
using namespace decaf::util;
using namespace decaf::util::concurrent;
using namespace cms;
using namespace std;

class SimpleProducer
{
public:
	SimpleProducer(){}
	virtual ~SimpleProducer();

	void start( const std::string& brokerURI, unsigned int numMessages, const std::string& destURI, bool useTopic , bool clientAck);
	void send(const char* bytesMessage,int nSize);
	void sendTxtMsg(const std::string& textMsg);
	
	void close();
	virtual void onException( const CMSException& ex AMQCPP_UNUSED );
    virtual void transportInterrupted();
    virtual void transportResumed();

private:
	void cleanup();
	virtual void initialize();
	virtual string UnicodeToUTF8( const wstring& str );
	virtual wstring ANSIToUnicode( const std::string& str );

private:
	Connection* connection;
	Session* session;
	Destination* destination;
	MessageProducer* producer;
	bool useTopic;
	bool clientAck;
	unsigned int numMessages;
	std::string brokerURI;
	std::string destURI;
	BytesMessage* bytesMessage;
	TextMessage* textMessage;
};

二.生产者实现


#include "stdafx.h"
#include "SimpleProducer.h"
#include <windows.h>


//liuwei
//QQ:851668663
SimpleProducer::~SimpleProducer()
{
	delete bytesMessage;
	delete textMessage;
	cleanup();
}

void SimpleProducer::start( const std::string& brokerURI, unsigned int numMessages, const std::string& destURI, bool useTopic = false, bool clientAck = false )
{
	this->connection = NULL;
	this->session = NULL;
	this->destination = NULL;
	this->producer = NULL;
	this->numMessages = numMessages;
	this->useTopic = useTopic;
	this->brokerURI = brokerURI;
	this->destURI = destURI;
	this->clientAck = clientAck;

	initialize();
}

void SimpleProducer::initialize() 
{
	try {
		// Create a ConnectionFactory
		ActiveMQConnectionFactory* connectionFactory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616?transport.useAsyncSend=true&maxReconnectDelay=10000");
		//connection = connectionFactory->createConnection("userName","pwd");

		connection = connectionFactory->createConnection();
 
		connection->start();
 
		// Create a Session
		if( clientAck ) {
			session = connection->createSession( Session::CLIENT_ACKNOWLEDGE );
		} else {
			session = connection->createSession( Session::AUTO_ACKNOWLEDGE );
		}
		
		// Create the destination (Topic or Queue)
		if( useTopic ) {
			destination = session->createTopic( destURI );
		} else {
			destination = session->createQueue( destURI );
		}
		// Create a MessageProducer from the Session to the Topic or Queue
		producer = session->createProducer( destination );
		producer->setDeliveryMode( DeliveryMode::NON_PERSISTENT );
	}catch ( CMSException& e ) {
		printf("createConnection faill!");
		e.printStackTrace();
	}
}

void SimpleProducer::send(const char* Message,int nSize)
{
	// 创建一个byte类型的消息
	bytesMessage = session->createBytesMessage((unsigned char*)Message,nSize);
	// 发送消息
	producer->send(bytesMessage );
	delete bytesMessage;
	//cleanup();
}

void SimpleProducer::sendTxtMsg(const std::string& textMsg)
{
	// 消息内容
	// 创建一个文本类型的消息
	TextMessage* message = session->createTextMessage();
	message->setStringProperty("language","c++");
	message->setText(UnicodeToUTF8(ANSIToUnicode(textMsg)));
	producer->send(message);
	delete message;
	//cleanup();
}

void SimpleProducer::onException( const CMSException& ex AMQCPP_UNUSED ) 
{
    //printf("CMS Exception occurred.  Shutting down client.\n");
    //exit(1);
}

void SimpleProducer::transportInterrupted() 
{
    //std::cout << "The Connection's Transport has been Interrupted." << std::endl;
	printf("The Connection's Transport has been Interrupted.");
}

void SimpleProducer::transportResumed() 
{
   // std::cout << "The Connection's Transport has been Restored." << std::endl;
	printf("The Connection's Transport has been Restored.");
}


wstring SimpleProducer::ANSIToUnicode( const std::string& str )
{
	int len = 0;
	len = str.length();
	int unicodeLen = ::MultiByteToWideChar( CP_ACP,0,str.c_str(),-1,NULL,0 ); 
	wchar_t * pUnicode; 
	pUnicode = new wchar_t[unicodeLen+1]; 
	memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t)); 
	::MultiByteToWideChar( CP_ACP,0,str.c_str(),-1,(LPWSTR)pUnicode,unicodeLen ); 
	wstring rt; 
	rt = ( wchar_t* )pUnicode;
	delete pUnicode; 
	return rt; 
}

string SimpleProducer::UnicodeToUTF8( const wstring& str )
{
	char*     pElementText;
	int    iTextLen;
	// wide char to multi char
	iTextLen = WideCharToMultiByte( CP_UTF8,0,str.c_str(),-1,NULL,0,NULL,NULL );
	pElementText = new char[iTextLen + 1];
	memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );
	::WideCharToMultiByte( CP_UTF8,0,str.c_str(),-1,pElementText,iTextLen,NULL,NULL );
	string strText;
	strText = pElementText;
	delete[] pElementText;
	return strText;

}


string UnicodeToANSI( const wstring& str )
{
	char*     pElementText;
	int    iTextLen;
	// wide char to multi char
	iTextLen = WideCharToMultiByte( CP_ACP,0,str.c_str(),-1,NULL,0,NULL,NULL );
	pElementText = new char[iTextLen + 1];
	memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );
	::WideCharToMultiByte( CP_ACP,0,str.c_str(),-1,pElementText,iTextLen,NULL,NULL );
	string strText;
	strText = pElementText;
	delete[] pElementText;
	return strText;
}

void close(){
	
}


void SimpleProducer::cleanup()
{
	// Destroy resources.
	try{
		if( destination != NULL ) delete destination;
	}catch ( CMSException& e ) { e.printStackTrace(); }
	destination = NULL;

	try{
		if( producer != NULL ) delete producer;
	}catch ( CMSException& e ) { e.printStackTrace(); }
	producer = NULL;

	// Close open resources.
	try{
		if( session != NULL ) session->close();
		if( connection != NULL ) connection->close();
	}catch ( CMSException& e ) { e.printStackTrace(); }

	try{
		if( session != NULL ) delete session;
	}catch ( CMSException& e ) { e.printStackTrace(); }
	session = NULL;

	try{
		if( connection != NULL ) delete connection;
	}catch ( CMSException& e ) { e.printStackTrace(); }
	connection = NULL;
}

三.消费者头文件定义 

#include <decaf/lang/Thread.h>
#include <decaf/lang/Runnable.h>
#include <decaf/util/concurrent/CountDownLatch.h>
#include <activemq/core/ActiveMQConnectionFactory.h>
#include <activemq/core/ActiveMQConnection.h>
#include <activemq/transport/DefaultTransportListener.h>
#include <activemq/library/ActiveMQCPP.h>
#include <decaf/lang/Integer.h>
#include <activemq/util/Config.h>
#include <decaf/util/Date.h>
#include <cms/Connection.h>
#include <cms/Session.h>
#include <cms/TextMessage.h>
#include <cms/BytesMessage.h>
#include <cms/MapMessage.h>
#include <cms/ExceptionListener.h>
#include <cms/MessageListener.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>

using namespace activemq;
using namespace activemq::core;
using namespace activemq::transport;
using namespace decaf::lang;
using namespace decaf::util;
using namespace decaf::util::concurrent;
using namespace cms;
using namespace std;


class SimpleAsyncConsumer : public ExceptionListener, public MessageListener, public DefaultTransportListener 
{
public:
    SimpleAsyncConsumer(){}
    virtual ~SimpleAsyncConsumer();

    void start(const std::string& brokerURI, const std::string& destURI, bool useTopic, bool clientAck );
    void close();
    void runConsumer();
    virtual void onMessage( const Message* message );
    virtual void onException( const CMSException& ex AMQCPP_UNUSED );
    virtual void transportInterrupted();
    virtual void transportResumed();

private:
    void cleanup();

private:
    Connection* connection;
    Session* session;
    Destination* destination;
    MessageConsumer* consumer;
    bool useTopic;
    bool clientAck;
    std::string brokerURI;
    std::string destURI;
	//CSharesCompute* csHaresCompute;
};

四.消费者实现

// 4、SimpleAsyncConsumer.cpp 

#include "stdafx.h"
#include "SimpleAsyncConsumer.h"

SimpleAsyncConsumer::~SimpleAsyncConsumer()
{
cleanup();
}

void SimpleAsyncConsumer::close() 
{
    cleanup();
}

void SimpleAsyncConsumer::start(const std::string& brokerURI, const std::string& destURI, bool useTopic, bool clientAck )
{
	this->connection = NULL;
	this->session = NULL;
	this->destination = NULL;
	this->consumer = NULL;

	this->useTopic = useTopic;
	this->brokerURI = brokerURI;
	this->destURI = destURI;
	this->clientAck = clientAck;

	runConsumer();
}

void SimpleAsyncConsumer::runConsumer() 
{
    try {

        // Create a ConnectionFactory
        //ActiveMQConnectionFactory* connectionFactory =  new ActiveMQConnectionFactory( brokerURI );

		ActiveMQConnectionFactory* connectionFactory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616?transport.useAsyncSend=true&maxReconnectDelay=10000");
		//connection = connectionFactory->createConnection("userName","pwd");
		connection = connectionFactory->createConnection();

        //delete connectionFactory;
        ActiveMQConnection* amqConnection = dynamic_cast<ActiveMQConnection*>( connection );
        if( amqConnection != NULL ) {
            amqConnection->addTransportListener( this );
        }
        connection->start();
        connection->setExceptionListener(this);

        // Create a Session
        if( clientAck ) {
            session = connection->createSession( Session::CLIENT_ACKNOWLEDGE );
        } else {
            session = connection->createSession( Session::AUTO_ACKNOWLEDGE );
        }

        // Create the destination (Topic or Queue)
        if( useTopic ) {
            destination = session->createTopic( destURI );
        } else {
            destination = session->createQueue( destURI );
        }

        // Create a MessageConsumer from the Session to the Topic or Queue
        consumer = session->createConsumer( destination );
        consumer->setMessageListener( this );

    } catch (CMSException& e) {
		printf("SimpleAsyncConsumer createConnection faill!");
        e.printStackTrace();
    }
}

// Called from the consumer since this class is a registered MessageListener.
void SimpleAsyncConsumer::onMessage( const Message* message )
{

	static int count = 0;
    try{
        count++;
        const TextMessage* txtMessage =
            dynamic_cast< const TextMessage* >( message );
        string text;

        if( txtMessage != NULL ) {
			text = txtMessage->getText();
        } else {
            text = "NOT A BYTE SMESSAGE!";
        }

        if( clientAck ) {
            message->acknowledge();
        }

       printf( "收到字符串MSG: %s\n", text.c_str() );


    } catch (CMSException& e) {
		printf("SimpleAsyncConsumer 接受消息失败!");
        e.printStackTrace();
    }
}



void SimpleAsyncConsumer::onException( const CMSException& ex AMQCPP_UNUSED ) 
{
    printf("CMS Exception occurred.  Shutting down client.\n");
    exit(1);
}

void SimpleAsyncConsumer::transportInterrupted() 
{
    std::cout << "The Connection's Transport has been Interrupted." << std::endl;
}

void SimpleAsyncConsumer::transportResumed() 
{
    std::cout << "The Connection's Transport has been Restored." << std::endl;
}



void SimpleAsyncConsumer::cleanup(){

        //*************************************************
        // Always close destination, consumers and producers before
        // you destroy their sessions and connection.
        //*************************************************

        // Destroy resources.
        try{
            if( destination != NULL ) delete destination;
        }catch (CMSException& e) {
		}
        destination = NULL;

        try{
            if( consumer != NULL ) delete consumer;
        }catch (CMSException& e) {
		}
        consumer = NULL;

        // Close open resources.
        try{
            if( session != NULL ) session->close();
            if( connection != NULL ) connection->close();
        }catch (CMSException& e) {
		}

        // Now Destroy them
        try{
            if( session != NULL ) delete session;
        }catch (CMSException& e) {
		}
        session = NULL;

        try{
            if( connection != NULL ) delete connection;
        }catch (CMSException& e) {
		}
        connection = NULL;
}

五.主函数调用示例 

// ActiveMQDemo.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "SimpleProducer.h"
#include "SimpleAsyncConsumer.h"



SimpleProducer g_SimpleProducer;
SimpleAsyncConsumer g_SimpleAsyncConsumer;
int _tmain(int argc, _TCHAR* argv[])
{

	activemq::library::ActiveMQCPP::initializeLibrary();
	std::string brokerURI;
	std::string destURI;
	bool useTopics;
	bool clientAck;
	//brokerURI ="tcp://127.0.0.1:61616?transport.useAsyncSend=true&maxReconnectDelay=10000";
	brokerURI ="failover:(tcp://localhost:61616)";
	useTopics = false;
	unsigned int numMessages = 99999999;
	clientAck = false;

	//destURI = "Queue.HQ.Local";
	//destURI = "Queue.HQ";
	
	//g_SimpleProducer.start( brokerURI, numMessages, destURI, useTopics ,clientAck);

	destURI = "Queue.test";
	g_SimpleProducer.start( brokerURI, numMessages, destURI, useTopics ,clientAck);
	g_SimpleProducer.sendTxtMsg("test");




	std::string brokerURIs;
	std::string destURIs;
	bool useTopicss;
	bool clientAcks;
	brokerURIs = "failover:(tcp://127.0.0.1:61616)";
	useTopicss = false;
	unsigned int numMessagess = 2000;
	destURIs = "Queue.test";
	clientAcks = false;
	g_SimpleAsyncConsumer.start(brokerURIs, destURIs, useTopicss, clientAcks);
	g_SimpleAsyncConsumer.runConsumer();

	
	printf("发送字符串数据ok");
	getchar();
	activemq::library::ActiveMQCPP::shutdownLibrary();
	return 0;
}
.这些地方是需要注意的

apr因为消费者需要,单独在C/C++ --->常规中的附加包含目录 引入,另外还有activemq-cpp的源码也是

D:\project\projectpc\work\activemq-cpp-library-3.4.0\src\main (换成你自己的目录放到附加包含目录)

下图是那些编译好的lib dll附加库目录 属性配置

这是将那些编译好的lib要加入到链接器 -> 输入->附加依赖项 中

activemq-cpp.lib apr-1.lib
apriconv-1.lib
aprutil-1.lib
cppunit.lib
libapr-1.lib
libapriconv-1.lib
libaprutil-1.lib
xml.lib

最后需要特别注意的是,需要把编译生成的各种dll放到exe执行目录下,这样执行exe的时候才能调用到那些内库,如下图

最最后要说明的当然是在运行的时候要运行activemq服务,先前就有同学说,他都配置好了,也能正常编译就是发不了消息也收不到消息,然后总找不到原因,希望同学细心点啊。

最后贴上demo运行示例图,收工!

C++调用ActiveMQ C++客户端调用ActiveMQ动态库 阅读详情

相关推荐

Active MQ C++实现通讯

Active MQ  C++实现通讯 Kagula 2011-9-13 简介 在参考资料[2]的基础上介绍如何用C++调用Active MQ的客户端API。 环境:[1]Windows XP SP3       [2]Visual Studio 2008 SP1 阅

lee353086的专栏 2万+

Windows下实现C++ 连接ActiveMQ

文章目录1.什么是ActiveMQ?2.能用来做什么?3. 支持的消息类型4.本地安装ActiveMQ服务4.1 下载地址4.2 启动4.3 配置文件activemq.xml5.C++实现连接ActiveMQ5.1 下载相关接口5.2 编译5.2.1 编译activemq-cpp工程5.2.2 编译libapr工程生成libapr-1.lib和libapr-1.dll库5.2.3 编译activemq-cpp.example例子工程,运行例子 1.什么是ActiveMQ? ActiveMQ是Apache软件

lsl-做一个优秀的人 5862

activemq-cpp vs2010

activemq-cpp3.9.4 vs2010 编译,带例子 debug 与release 完美使用完美编译版本,值得下载使用!

C++连接activemq遇到的坑

近期和甲方对接,要求使用activemq, 只给了对接的IP、端口、队列、用户名、密码的信息。但是过程还是很曲折的。建议用比较干净的机器搭建, 一些加域的机器最好不要用,如何搭建MQ和如何安装JAVA环境,参考下面的两个连接。1、activmq 使用C++连接有两种方式, 第一种是stomp, 第二种是activemq的开源库。例子的代码都是封装继承了Therad, 需要利用线程运行,如何调用,线程都已经规划好。stomp默认的端口是61613, 开源库是61616. 而甲方提供的说61616,

问渠哪得清如许 404

从零搭建 AI 运维 Agent:告警自动诊断 + 修复的完整技术方案

适合读者:管理 5-50 台服务器的运维/SRE 工程师、技术负责人 技术栈:FastAPI + React + PostgreSQL + Redis + DeepSeek 关键词:AI运维、AIOps、自动化运维、智能告警、告警修复、Runbook自动化、DevOps、SRE、DeepSeek运维

weixin_38359457的博客 1640

Nettrace 源码分析

文章介绍:本文将围绕腾讯开源项目nettrace工具中数据采集,数据处理,数据分析三个模块深入源码分析其实现细节

abobob的博客 989

使用ActiveMQ进行C++与C#的通信

该系列文章介绍如何通过ActiveMQ在C++和C#控制台项目之间通信。 关于ActiveMQ的介绍可以参考《深入浅出ActiveMQ》,平台搭建可以参考《Activemq 平台搭建与C#示列》,两者之间有交叉内容,这里我以ActiveMQ之user-guide翻译为开篇,如有纰漏、错误敬请指正。 ActiveMQ入门 从这篇文章中你可以对Apache ActiveMQ有个概览并开始尝试使用它。 1、运行代理 从ActiveMQ的二进制分发包,你可以通过bin\activemq命令启动ActiveMQ。如

hbspring007的专栏 519

Active MQ C++实现通讯记录

Active MQ C++实现通讯 背景知识: ActiveMQ是一个易于使用的消息中间件。 消息中间件 我们简单的介绍一下消息中间件,对它有一个基本认识就好,消息中间件(MOM:Message Orient middleware)。 消息中间件有很多的用途和优点: 1. 将数据从一个应用程序传送到另一个应用程序,或者从软件的一个模块传送到另外一个模块; 2. ...

angu5913的博客 405

一觉醒后ChatGPT 被淘汰了

近日,AI 界貌似出现了一种新的趋势:自主人工智能。这不是空穴来风,最近一个名为 AutoGPT 的研究开始走进大众视野。特斯拉前 AI 总监、刚刚回归 OpenAI 的 Andrej Karpathy 也为其大力宣传,并在推特赞扬:「AutoGPT 是 prompt 工程的下一个前沿。」

Rocky006的博客 13万+

Windows系统监控实战:Grafana+Prometheus+node_exporter配置全攻略

本文提供了一套完整的Windows系统监控解决方案,详细介绍了如何使用Grafana、Prometheus和node_exporter(Windows版为windows_exporter)构建可视化监控平台。从环境准备、组件安装配置,到数据可视化与常见问题排查,手把手指导您实现从数据采集到仪表盘展示的全过程,帮助您从被动救火转向主动预警,有效保障Windows服务器稳定运行。

assembly8low的博客 248

关于c++(客户端)和JAVA(服务端)的TCP通讯(基于stomp协议)(一)

最近在做软件插件的更新服务,其中涉及到客户端和服务端通讯,采取服务端推送的形式进行更新数据包的推送。 经过商讨后采取TCP通讯,由于服务端是JAVA的,客户端是C++。 一番查找学习后,绝对用ACTIVEMQ: http://stomp.github.io/implementations.html#Clients 在http://wenku.baidu.com/view/5eb31ea128

ss20yy1314的专栏 2937

某东x-api-eid-token风控参数分析与破解

x-api-eid-token是京东的风控参数,在接口当中,如果没有该参数,有一定的概率能请求成功,但是在请求一段时间后,会报403权限失败的,该参数主要通过jsTk.do这个接口生成,并且会将其存储到cookie当中。

zhouzhou_98的博客 1552

C/C++大文件/数据网络传输方法总结

在C/C++网络编程中不免会遇到需要传输大数据、大文件的情况,而由于socket本身缓冲区的限制,大概一次只能发送4K左右的数据,所以在传输大数据时客户端就需要进行分包,在目的地重新组包。而实际上已有一些消息/通讯中间件对此进行了封装,提供了直接发送大数据/文件的接口;除此之外,利用共享目录,ftp,ssh等系统命令来实现大文件/数据也不失为一种好的方法。

jmppok的专栏 1万+

ardupilot 日志分析《xKF1信息》

ardupilot 日志分析系列将会把ardupilot所有的日志文档进行分析,为我们分析无人机的运行状态,炸鸡原因,传感器状态,电机状态,控制信息,滤波信息做准备。本节主要分析xKF1日志信息,欢迎批评指正。学习好ardupilot必须会分析飞行日志,从飞行日志中我们可以学到很多无人机的知识。无人机是综合知识的体现,涵盖:导航、控制、滤波、算法、协议等各种知识,只有更全面的学习,才能在无人机的道路上越走越远。

陌城烟雨 1225

SAP-ABAP: BP主数据完全指南:从基础到高阶应用

SAP-ABAP: BP主数据完全指南:从基础到高阶应用

baidu_35680696的博客 1647

C++ ActiveMQ

点击打开链接搭建ActiveMq通讯步骤: 1:安装并运行activemq.bat批处理文件 首先下载apache-activemq-5.1.0-bin.zip压缩文件,官方下载地址:http://activemq.apache.org/download.html 在getting past releases中选择自己的版本 2:解压文件到本地目录下,找到bin目录下的active

u013474032的专栏 2938

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Mqtt开发笔记:windows下C++ ActiveMQ客户端介绍、编译和使用

使到mqtt协议,之前编译QtMqtt库,不支持队列模式queue(点对点),只支持订阅/发布者模式.,所以使用C++ ActiveMQ实现。本篇编译C++ ActiveMQ

长沙红胖子 Qt・西安|省级科研团队从业背景,深耕双一流体系高精尖技术配套研发|剥离高精尖机理,沉淀高端特种行业领域 Qt 工程化落地经验|博文仅分享通用技术总结,输出公开普适工程思路。 2万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

ActiveMQ C++ tutorial

说明[编辑] 本文会结合一个例子简要的说明activemq的c++客户端的使用方法 Apache ActiveMQ简介[编辑] Apache ActiveMQ是一个开源的消息服务器,实现了JMS规范,支持多语言客户端和协议。 ActiveMQ-CPP[编辑] ActiveMQ-CPP是c++客户端,目前支持 OpenWire and Stomp协议,两者都可以通过TCP

1621

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

linux C++ 环境下的ActiveMQ学习

ActiveMQ 1.概述 ActiveMQ 是Apache出品,最流行的、功能强大的即时通讯和集成模式的开源服务器。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现。提供客户端支持跨语言和协议,带有易于在充分支持JMS 1.1和1.4使用J2EE企业集成模式和许多先进的功能。 2.特点 2.⒈ 多种语言和协议编写客户端。语言: Java,...

更与何人说♫ 1379

C++ activemq CMS 学习笔记

很早前就仓促的接触过activemq,但当时太赶时间.后面发现activemq 需要了解的东西实在是太多了. 关于activemq 一直想起一遍文章.但也一直缺少自己的见解.或许是网上这些文章太多了.也可能是自己知识还不足够. 0,activemq-cpp 能解决什么问题. 实际应用就是让开发者能从多线程,多消息通信中解救出来.更多的关注应用逻辑...

weixin_34358365的博客 652
上一篇: Java 将数据库对应的表生成对应的实体类,包含注释信息
下一篇: JAVA之JNI从头完整实例
北极心lw
博客等级 码龄10年 10粉丝 8原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值