`
javahacker2
  • 浏览: 43500 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JMS实现简单聊天程序

阅读更多

使用了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;

Java代码 复制代码 收藏代码
  1. import java.io.BufferedReader;   
  2. import java.io.InputStreamReader;   
  3. import java.util.Properties;   
  4.   
  5. import javax.jms.JMSException;   
  6. import javax.jms.Message;   
  7. import javax.jms.MessageListener;   
  8. import javax.jms.Session;   
  9. import javax.jms.TextMessage;   
  10. import javax.jms.Topic;   
  11. import javax.jms.TopicConnection;   
  12. import javax.jms.TopicConnectionFactory;   
  13. import javax.jms.TopicPublisher;   
  14. import javax.jms.TopicSession;   
  15. import javax.jms.TopicSubscriber;   
  16. import javax.naming.Context;   
  17. import javax.naming.InitialContext;   
  18.   
  19.   
  20. public class Chat implements MessageListener {   
  21.   
  22.     private TopicSession pubSession;   
  23.     private TopicPublisher publisher;   
  24.     private TopicConnection connection;   
  25.     private String username;   
  26.   
  27.     // 用于初始化chat的构造函数   
  28.     public Chat(String topicFactory, String topicName, String username)   
  29.             throws Exception {   
  30. //      Properties env=new Properties();   
  31. //      env.put(Context.SECURITY_PRINCIPAL, "system");   
  32. //      env.put(Context.SECURITY_CREDENTIALS, "manager");   
  33. //      env.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.jndi.ActiveMQInitialContextFactory");   
  34. //      env.put(Context.PROVIDER_URL, "tcp://localhost:61616");   
  35.            
  36.         // 使用jndi.properties文件获得一个JNDI连接   
  37.         InitialContext ctx = new InitialContext();   
  38.   
  39.         // 查找一个jms连接工厂并创建连接   
  40.         TopicConnectionFactory conFactory = (TopicConnectionFactory) ctx   
  41.                 .lookup(topicFactory);   
  42.         TopicConnection connection = conFactory.createTopicConnection();   
  43.   
  44.         // 创建两个JMS会话对象   
  45.         TopicSession pubSession = connection.createTopicSession(false,   
  46.                 Session.AUTO_ACKNOWLEDGE);   
  47.         TopicSession subSession = connection.createTopicSession(false,   
  48.                 Session.AUTO_ACKNOWLEDGE);   
  49.   
  50.         // 查找一个JMS主题   
  51.         Topic chatTopic = (Topic) ctx.lookup(topicName);   
  52.   
  53.         // 创建一个JMS发布者和订阅者,createSubscriber中附加的参数是一个消息   
  54.         // 选择器(null)和noLocal标记的一个真值,它表明这个发布者生产的消息不应被他自己所消费   
  55.         TopicPublisher publisher = pubSession.createPublisher(chatTopic);   
  56.         TopicSubscriber subscriber = subSession.createSubscriber(chatTopic,   
  57.                 nulltrue);   
  58.   
  59.         // 设置一个JMS消息侦听器   
  60.         subscriber.setMessageListener(this);   
  61.   
  62.         // 初始化Chat应用程序变量   
  63.         this.connection = connection;   
  64.         this.pubSession = pubSession;   
  65.         this.publisher = publisher;   
  66.         this.username = username;   
  67.   
  68.         // 启动JMS连接,允许传递消息   
  69.         connection.start();   
  70.     }   
  71.   
  72.     // 接受来自TopicSubscriber的消息   
  73.     public void onMessage(Message message) {   
  74.         try {   
  75.             TextMessage textMessage = (TextMessage) message;   
  76.             System.out.println(textMessage.getText());   
  77.   
  78.         } catch (JMSException jmse) {   
  79.             jmse.printStackTrace();   
  80.         }   
  81.     }   
  82.   
  83.     // 使用发布者创建并发送消息   
  84.     protected void writeMessage(String text) throws JMSException {   
  85.         TextMessage message = pubSession.createTextMessage();   
  86.         message.setText(username + " : " + text);   
  87.         publisher.publish(message);   
  88.     }   
  89.   
  90.     // 关闭JMS连接   
  91.     public void close() throws JMSException {   
  92.         connection.close();   
  93.     }   
  94.   
  95.     // 运行聊天客户端   
  96.     public static void main(String[] args) {   
  97.         try {   
  98.             if (args.length != 3) {   
  99.                 System.out.println("Factory.Topic.or username missing");   
  100.             }   
  101.             String topicFactory="TopicCF";   
  102.             String topicName="topic1";   
  103.             String username="lyb";   
  104.             Chat chat = new Chat(topicFactory, topicName, username);   
  105.   
  106.             // 从命令行读取   
  107.             BufferedReader commandLine = new BufferedReader(   
  108.                     new InputStreamReader(System.in));   
  109.   
  110.             // 循环   
  111.             while (true) {   
  112.                 String s = commandLine.readLine();   
  113.                 if (s.equalsIgnoreCase("exit")) {   
  114.                     chat.close();   
  115.                     System.exit(0);   
  116.                 } else {   
  117.                     chat.writeMessage(s);   
  118.                 }   
  119.             }   
  120.         } catch (Exception e) {   
  121.             e.printStackTrace();   
  122.         }   
  123.         ;   
  124.     }   
  125.   
  126. }  
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();
		}
		;
	}

}
Java代码 复制代码 收藏代码
  1.   

Java代码 复制代码 收藏代码
  1.   

     将以上的类复制一份,放在同一个包下面。一份代码作为消息的发布方,一份代码作为消息的订阅方。

     整个程序的工程结构组织见下图

 

    

    二

 

  第三步、配置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实战——实现一个简易版的聊天室

    在本篇《ActiveMQ实战——实现一个简易版的聊天室》中,我们将深入探讨如何利用Apache ActiveMQ构建一个简单的在线聊天应用。ActiveMQ是Apache软件基金会的一个开源项目,它是一款功能强大的消息中间件,用于在...

    java实现的聊天工具 简易版 非常适合学习用

    Java实现的聊天工具是一款非常适合初学者和进阶者学习的项目,它虽然简单,但却包含了构建基本聊天应用所需的关键技术。这款简易版的聊天工具在设计时,充分考虑了教学和实践的需求,通过全面的注释,使得学习者能够...

    J2EE实现的简易网上聊天室

    【标题】"J2EE实现的简易网上聊天室"是一个基于Java企业版(J2EE)技术构建的在线交流平台,旨在提供一个简单易用、实时互动的沟通环境。这个项目对于初学者来说是一个很好的实践案例,可以帮助他们深入理解J2EE的...

    springMVC activemq简单聊天室

    总的来说,“springMVC activemq简单聊天室”项目展示了如何利用SpringMVC处理Web请求,与ActiveMQ结合实现异步通信,构建一个实时、多用户交互的在线聊天系统。这种架构模式在许多实时协作应用、社交平台和企业级...

    JMS ActiveMQ演示代码

    在"jms_chat"这个文件中,可能包含了一个简单的聊天应用程序的示例。通常,这个应用会模拟用户发送消息到服务器,服务器通过ActiveMQ将这些消息放入队列,然后其他客户端可以从队列中取出并显示这些消息。这种设计...

    flex 结合spring activemq 做的一个简易聊天室

    标题中的“flex结合spring activemq做了一个简易聊天室”涉及到的是使用Adobe Flex技术构建前端UI,通过Spring框架与ActiveMQ消息中间件进行通信,实现一个简单的聊天室应用。这个项目是一个很好的示例,展示了如何...

    JMSChat:简单聊天(JMS)

    1. **OpenJMS**:`JMSChat`可能依赖于OpenJMS,这是一个开源的JMS实现,提供了一个完整的消息中间件服务器,支持点对点和发布/订阅模型。开发者可以利用OpenJMS提供的服务器和客户端库来构建JMS应用。 2. **库引用*...

    实现一个B/S结构聊天室的基本功能。

    基于提供的标题、描述和标签,我们可以深入探讨实现这样一个聊天室所需的关键知识点。 首先,我们需要理解B/S架构的基础。这种架构模式下,用户通过Web浏览器访问服务器上的应用程序,进行数据交互。在这种情况下,...

    JMS+ActiveMQ 完整样例代码

    6. **聊天器应用**:在提供的样例中,可能会包含一个简单的聊天应用程序,它利用JMS和ActiveMQ实现实时的消息传递。这将帮助理解JMS如何在实际应用中工作,例如在即时通讯软件中。 通过深入研究这个样例代码,初学...

    ActiveMQ实例

    为了实现这个,你需要使用JMS API创建连接工厂,并在Swing事件处理中使用它来发送和接收消息。 3. **ActiveMQ与Ajax整合**: Ajax(Asynchronous JavaScript and XML)是一种在不刷新整个网页的情况下更新部分网页...

    Java与网络程序设计

    可以尝试创建简单的聊天室应用、文件下载服务或者构建一个小型的Web服务器,将所学的Java网络编程知识付诸实践。 总之,"Java与网络程序设计"涵盖了从基础的Java语法到复杂的网络通信技术,是一门全面的课程,旨在...

    jboss6-jms-chat:添加基于http的简单Java EE 6 MDB和JMS队列生产者

    3. `pom.xml` - Maven构建文件,定义了项目的依赖,如JBoss AS 6的相关库,Java EE 6 API,以及JMS实现(如hornetq或activemq)。 4. `README.md` - 项目说明,指导用户如何编译、部署和运行示例。 5. `deploy`或`...

    java应用软件程序设计

    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...

    JAVA上百实例源码以及开源项目源代码

    Java编写的山寨QQ,多人聊天+用户在线 21个目标文件 摘要:JAVA源码,媒体网络,山寨QQ,Java聊天程序 Java编写的山寨QQ,多人聊天+用户在线,程序分服务端和客户端,典型C/S结构, 当用户发送第一次请求的时候,验证...

    JAVA程序开发技术

    - **示例**:简单的聊天室。 **3.6.2 可以服务于多个客户端的多线程程序** - **示例**:多客户端并发聊天室。 #### 第四章:JDBC技术 **4.1 概述** - **定义**:Java数据库连接技术。 - **目的**:允许Java程序与...

    h_JAVA 2应用编程150例.rar

    实例74 实现一个简单的代理服务器 246 实例75 C/S结构的分布式运算 248 第7章 Java B/S结构编程 253 实例76 简单的Servlet程序 254 实例77 简单的留言簿 256 实例78 JSP+Java Bean的计数器 258 实例79 数据库查询 ...

Global site tag (gtag.js) - Google Analytics