使用了JMS的开源实现activemq消息中间件。各版本都行
分为如下几步完成。
第一步:安装activemq
(1)下载解压到E:\open_source\activeMQ\apache-activemq-5.5.0,并在环境变量配置ACTIVEMQ_HOME
(2)因为apache-activemq-5.5.0需要使用slf4j-1.5.11版本的jar包,下载slf4j
第二步:编写相应的代码,如下:
package ch02.chat;
- import java.io.BufferedReader;
- import java.io.InputStreamReader;
- import java.util.Properties;
- import javax.jms.JMSException;
- import javax.jms.Message;
- import javax.jms.MessageListener;
- import javax.jms.Session;
- import javax.jms.TextMessage;
- import javax.jms.Topic;
- import javax.jms.TopicConnection;
- import javax.jms.TopicConnectionFactory;
- import javax.jms.TopicPublisher;
- import javax.jms.TopicSession;
- import javax.jms.TopicSubscriber;
- import javax.naming.Context;
- import javax.naming.InitialContext;
- public class Chat implements MessageListener {
- private TopicSession pubSession;
- private TopicPublisher publisher;
- private TopicConnection connection;
- private String username;
- // 用于初始化chat的构造函数
- public Chat(String topicFactory, String topicName, String username)
- throws Exception {
- // Properties env=new Properties();
- // env.put(Context.SECURITY_PRINCIPAL, "system");
- // env.put(Context.SECURITY_CREDENTIALS, "manager");
- // env.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
- // env.put(Context.PROVIDER_URL, "tcp://localhost:61616");
- // 使用jndi.properties文件获得一个JNDI连接
- InitialContext ctx = new InitialContext();
- // 查找一个jms连接工厂并创建连接
- TopicConnectionFactory conFactory = (TopicConnectionFactory) ctx
- .lookup(topicFactory);
- TopicConnection connection = conFactory.createTopicConnection();
- // 创建两个JMS会话对象
- TopicSession pubSession = connection.createTopicSession(false,
- Session.AUTO_ACKNOWLEDGE);
- TopicSession subSession = connection.createTopicSession(false,
- Session.AUTO_ACKNOWLEDGE);
- // 查找一个JMS主题
- Topic chatTopic = (Topic) ctx.lookup(topicName);
- // 创建一个JMS发布者和订阅者,createSubscriber中附加的参数是一个消息
- // 选择器(null)和noLocal标记的一个真值,它表明这个发布者生产的消息不应被他自己所消费
- TopicPublisher publisher = pubSession.createPublisher(chatTopic);
- TopicSubscriber subscriber = subSession.createSubscriber(chatTopic,
- null, true);
- // 设置一个JMS消息侦听器
- subscriber.setMessageListener(this);
- // 初始化Chat应用程序变量
- this.connection = connection;
- this.pubSession = pubSession;
- this.publisher = publisher;
- this.username = username;
- // 启动JMS连接,允许传递消息
- connection.start();
- }
- // 接受来自TopicSubscriber的消息
- public void onMessage(Message message) {
- try {
- TextMessage textMessage = (TextMessage) message;
- System.out.println(textMessage.getText());
- } catch (JMSException jmse) {
- jmse.printStackTrace();
- }
- }
- // 使用发布者创建并发送消息
- protected void writeMessage(String text) throws JMSException {
- TextMessage message = pubSession.createTextMessage();
- message.setText(username + " : " + text);
- publisher.publish(message);
- }
- // 关闭JMS连接
- public void close() throws JMSException {
- connection.close();
- }
- // 运行聊天客户端
- public static void main(String[] args) {
- try {
- if (args.length != 3) {
- System.out.println("Factory.Topic.or username missing");
- }
- String topicFactory="TopicCF";
- String topicName="topic1";
- String username="lyb";
- Chat chat = new Chat(topicFactory, topicName, username);
- // 从命令行读取
- BufferedReader commandLine = new BufferedReader(
- new InputStreamReader(System.in));
- // 循环
- while (true) {
- String s = commandLine.readLine();
- if (s.equalsIgnoreCase("exit")) {
- chat.close();
- System.exit(0);
- } else {
- chat.writeMessage(s);
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- ;
- }
- }
import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Properties; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.Session; import javax.jms.TextMessage; import javax.jms.Topic; import javax.jms.TopicConnection; import javax.jms.TopicConnectionFactory; import javax.jms.TopicPublisher; import javax.jms.TopicSession; import javax.jms.TopicSubscriber; import javax.naming.Context; import javax.naming.InitialContext; public class Chat implements MessageListener { private TopicSession pubSession; private TopicPublisher publisher; private TopicConnection connection; private String username; // 用于初始化chat的构造函数 public Chat(String topicFactory, String topicName, String username) throws Exception { // Properties env=new Properties(); // env.put(Context.SECURITY_PRINCIPAL, "system"); // env.put(Context.SECURITY_CREDENTIALS, "manager"); // env.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.jndi.ActiveMQInitialContextFactory"); // env.put(Context.PROVIDER_URL, "tcp://localhost:61616"); // 使用jndi.properties文件获得一个JNDI连接 InitialContext ctx = new InitialContext(); // 查找一个jms连接工厂并创建连接 TopicConnectionFactory conFactory = (TopicConnectionFactory) ctx .lookup(topicFactory); TopicConnection connection = conFactory.createTopicConnection(); // 创建两个JMS会话对象 TopicSession pubSession = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); TopicSession subSession = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); // 查找一个JMS主题 Topic chatTopic = (Topic) ctx.lookup(topicName); // 创建一个JMS发布者和订阅者,createSubscriber中附加的参数是一个消息 // 选择器(null)和noLocal标记的一个真值,它表明这个发布者生产的消息不应被他自己所消费 TopicPublisher publisher = pubSession.createPublisher(chatTopic); TopicSubscriber subscriber = subSession.createSubscriber(chatTopic, null, true); // 设置一个JMS消息侦听器 subscriber.setMessageListener(this); // 初始化Chat应用程序变量 this.connection = connection; this.pubSession = pubSession; this.publisher = publisher; this.username = username; // 启动JMS连接,允许传递消息 connection.start(); } // 接受来自TopicSubscriber的消息 public void onMessage(Message message) { try { TextMessage textMessage = (TextMessage) message; System.out.println(textMessage.getText()); } catch (JMSException jmse) { jmse.printStackTrace(); } } // 使用发布者创建并发送消息 protected void writeMessage(String text) throws JMSException { TextMessage message = pubSession.createTextMessage(); message.setText(username + " : " + text); publisher.publish(message); } // 关闭JMS连接 public void close() throws JMSException { connection.close(); } // 运行聊天客户端 public static void main(String[] args) { try { if (args.length != 3) { System.out.println("Factory.Topic.or username missing"); } String topicFactory="TopicCF"; String topicName="topic1"; String username="lyb"; Chat chat = new Chat(topicFactory, topicName, username); // 从命令行读取 BufferedReader commandLine = new BufferedReader( new InputStreamReader(System.in)); // 循环 while (true) { String s = commandLine.readLine(); if (s.equalsIgnoreCase("exit")) { chat.close(); System.exit(0); } else { chat.writeMessage(s); } } } catch (Exception e) { e.printStackTrace(); } ; } }
将以上的类复制一份,放在同一个包下面。一份代码作为消息的发布方,一份代码作为消息的订阅方。
整个程序的工程结构组织见下图
第三步、配置jndi文件
java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory
java.naming.provider.url=tcp://localhost\:61616
java.naming.security.principal=system
java.naming.security.credentials=manager
connectionFactoryNames=TopicCF
topic.topic1=jms.topic1
第四步、启动activeMQ,分别运行Chat.java和CopyChat.java,可以在两个程序之间交互信息
相关推荐
在本篇《ActiveMQ实战——实现一个简易版的聊天室》中,我们将深入探讨如何利用Apache ActiveMQ构建一个简单的在线聊天应用。ActiveMQ是Apache软件基金会的一个开源项目,它是一款功能强大的消息中间件,用于在...
Java实现的聊天工具是一款非常适合初学者和进阶者学习的项目,它虽然简单,但却包含了构建基本聊天应用所需的关键技术。这款简易版的聊天工具在设计时,充分考虑了教学和实践的需求,通过全面的注释,使得学习者能够...
【标题】"J2EE实现的简易网上聊天室"是一个基于Java企业版(J2EE)技术构建的在线交流平台,旨在提供一个简单易用、实时互动的沟通环境。这个项目对于初学者来说是一个很好的实践案例,可以帮助他们深入理解J2EE的...
总的来说,“springMVC activemq简单聊天室”项目展示了如何利用SpringMVC处理Web请求,与ActiveMQ结合实现异步通信,构建一个实时、多用户交互的在线聊天系统。这种架构模式在许多实时协作应用、社交平台和企业级...
在"jms_chat"这个文件中,可能包含了一个简单的聊天应用程序的示例。通常,这个应用会模拟用户发送消息到服务器,服务器通过ActiveMQ将这些消息放入队列,然后其他客户端可以从队列中取出并显示这些消息。这种设计...
标题中的“flex结合spring activemq做了一个简易聊天室”涉及到的是使用Adobe Flex技术构建前端UI,通过Spring框架与ActiveMQ消息中间件进行通信,实现一个简单的聊天室应用。这个项目是一个很好的示例,展示了如何...
1. **OpenJMS**:`JMSChat`可能依赖于OpenJMS,这是一个开源的JMS实现,提供了一个完整的消息中间件服务器,支持点对点和发布/订阅模型。开发者可以利用OpenJMS提供的服务器和客户端库来构建JMS应用。 2. **库引用*...
基于提供的标题、描述和标签,我们可以深入探讨实现这样一个聊天室所需的关键知识点。 首先,我们需要理解B/S架构的基础。这种架构模式下,用户通过Web浏览器访问服务器上的应用程序,进行数据交互。在这种情况下,...
6. **聊天器应用**:在提供的样例中,可能会包含一个简单的聊天应用程序,它利用JMS和ActiveMQ实现实时的消息传递。这将帮助理解JMS如何在实际应用中工作,例如在即时通讯软件中。 通过深入研究这个样例代码,初学...
为了实现这个,你需要使用JMS API创建连接工厂,并在Swing事件处理中使用它来发送和接收消息。 3. **ActiveMQ与Ajax整合**: Ajax(Asynchronous JavaScript and XML)是一种在不刷新整个网页的情况下更新部分网页...
可以尝试创建简单的聊天室应用、文件下载服务或者构建一个小型的Web服务器,将所学的Java网络编程知识付诸实践。 总之,"Java与网络程序设计"涵盖了从基础的Java语法到复杂的网络通信技术,是一门全面的课程,旨在...
3. `pom.xml` - Maven构建文件,定义了项目的依赖,如JBoss AS 6的相关库,Java EE 6 API,以及JMS实现(如hornetq或activemq)。 4. `README.md` - 项目说明,指导用户如何编译、部署和运行示例。 5. `deploy`或`...
195 第6章 Java C/S结构编程 197 实例67 实现C/S多线程 198 实例68 客户端程序 200 实例69 服务器端程序 201 实例70 C/S结构聊天室 203 实例71 基于C/S的小游戏 209 实例72 应用C/S数据库 237...
- **远程访问服务**:允许客户端程序(如Flex或AIR)通过简单的API来调用服务器端的业务逻辑。 - **实时消息传递**:支持客户端之间的实时消息交换,使开发者能够构建具备即时通信功能的应用。 - **高性能通信**:...
- **示例**:简单的聊天室。 **3.6.2 可以服务于多个客户端的多线程程序** - **示例**:多客户端并发聊天室。 #### 第四章:JDBC技术 **4.1 概述** - **定义**:Java数据库连接技术。 - **目的**:允许Java程序与...
实例74 实现一个简单的代理服务器 246 实例75 C/S结构的分布式运算 248 第7章 Java B/S结构编程 253 实例76 简单的Servlet程序 254 实例77 简单的留言簿 256 实例78 JSP+Java Bean的计数器 258 实例79 数据库查询 ...