文档章节

示例A(聊天应用程序)之源代码

柳哥
 柳哥
发布于 2014/03/31 20:32
字数 620
阅读 160
收藏 7
JMS

为了说明JMS是如何工作的,我们将使用JMS的pub/sub API来构建一个简单的聊天应用程序。下面是一个基于JMS的聊天客户端的完整源代码清单。在一个聊天会话中,每个聊天参与者都使用这个Chat程序,加入一个特定的聊天室(主题)之中,并向该聊天室传送消息,以及从该聊天室中接收消息。如例:

package ch01;

import java.io.BufferedReader;
import java.io.InputStreamReader;
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.InitialContext;

/**
 * 基于JMS的聊天应用程序
 * @author fuhd
 */
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{
	    //使用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标记的一个false值,它表明这个发布者生
	    //产的消息也要被它自己所消费
	    TopicPublisher publisher = pubSession.createPublisher(chatTopic);
	    TopicSubscriber subscriber = subSession.createSubscriber(chatTopic, 
	        null, false);
	    //设置一个JMS消息侦听器
	    subscriber.setMessageListener(this);
	    //初始化Chat应用程序
	    this.connection = connection;
	    this.pubSession = pubSession;
	    this.publisher = publisher;
	    this.userName = userName;
	    //启动JMS连接,允许传递消息
	    connection.start();
	}
	
	//接收自TopicSubscriber的消息*/
	@Override
	public void onMessage(Message message) {
		try {
			TextMessage textMessage = (TextMessage)message;
			System.out.println(textMessage.getText());
		} catch (JMSException e) {
			e.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 {
		    Chat chat = new Chat("TopicCF","topic1","fuhd");
		    //从命令行读取
		    BufferedReader commandLine = new BufferedReader(
		        new InputStreamReader(System.in));
		    //循环,直到键入“exit”为止
		    while(true){
			String s = commandLine.readLine();
			if(s.equalsIgnoreCase("exit")){
			    chat.close();
			    System.exit(0);
			}else{
		            chat.writeMessage(s);
		        }
		    }
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

请注意:使用createSubscriber()方法创建接收者时,它采用3个参数而不仅仅是一个参数。这样就可以设置noLocal标记(第3个参数),如果值为true,自己不接收自己所发的消息,如果值为false,自己也接收自己发的消息。第2个参数用于一个消息选择器,由于并不对主题做任何过滤,这个值就被设置为null

© 著作权归作者所有

柳哥
粉丝 207
博文 405
码字总数 347782
作品 0
杭州
技术主管
私信 提问
借助 Microsoft Excel 构建 Amazon Lex 聊天机器人

我们的香港机构 (IVE) 已开始尝试将 Amazon Lex 应用于教学、研究和医疗保健领域。我们有很多非技术员工,如 IVE 的英语教师,以及 IVE 育儿、长者及社区服务处的治疗师;他们没有技术知识,...

亚马逊AWS
2018/07/24
0
0
用 Git 作为聊天应用的后端

GIC 是一个聊天应用程序的原型,展示了一种使用 Git 的新方法。 Git 是一个少有的能将如此多的现代计算封装到一个程序之中的应用程序,它可以用作许多其他应用程序的计算引擎。虽然它以跟踪软...

作者: Seth Kenlon
09/15
0
0
WebSocket 和 Golang 实现聊天功能

本文同步至 http://www.waylau.com/go-websocket-chat/ 这个示例应用程序展示了如何使用 WebSocket, Golang 和 jQuery 创建一个简单的web聊天应用程序。这个示例的源代码在 https://github.c...

waylau
2014/11/19
2.4K
2
Android 开发即时聊天工具 YQ :(一) Socket 初步

这段时间在学习Android网络编程,习惯一边写个简单的项目一边学习,所以就有了这个简易的简易的,,,项目, 类似于手机QQ等等的即时聊天工具,当然功能及其简单,跟那些没法比,只是学习,实...

长平狐
2012/10/08
189
0
JavaScript/jQuery、HTML、CSS 构建 Web IM 远程及时聊天通信程序

这篇文章主要介绍用JavaScript和jQuery、HTML、CSS以及用第三方聊天JavaScript(jsjac)框架构建一个BS Web的聊天应用程序。此程序可以和所有连接到Openfire服务器的应用进行通信、发送消息。...

hoojo
2012/08/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

怎样在磁盘上查找MySQL表的大小?这里有答案

我想知道 MySQL 表在磁盘上占用多少空间,但看起来很琐碎。不应该在 INFORMATION_SCHEMA.TABLES 中提供这些信息吗?没那么简单! 我想知道 MySQL 表在磁盘上占用多少空间,但看起来很琐碎。不应...

Linux就该这么学
41分钟前
5
0
Redis

一、Redis支持的几种数据类型:字符串、List、SET、HASH、ZSET 二、Redis的缓存技术主要是为了降低关系数据库的负载并减少网站成本 三、在Redis里面,被MULTI命令和EXEC命令包围的所有命令会...

BobwithB
43分钟前
4
0
MongoDB基础之入门

MongoDB基础之入门 一、MONGODB简介 MongoDB由C/C++开发,是一种强大、灵活、可扩展的数据存储方式。它扩展了关系型数据库的众多有用功能,例如:辅助索引、范围查询和排序。MongoDB还内置了...

星汉
45分钟前
7
0
c++ 神奇的赋值用法

c++ 神奇的赋值用法(第8章)

天王盖地虎626
今天
5
0
Jquery操作UI之设置字体大小

先获取字体大小,进行处理。再将修改的值保存。 slice() 方法可从已有的数组中返回选定的元素。 arrayObject.slice(start,end)。 start 必需。规定从何处开始选取。如果是负数,那么它规定从...

前端老手
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部