java+rabbitMQ实现一对一聊天

源码地址: https://download.csdn.net/download/weixin_40461281/10321780

上一篇文章讲了RabbitMQ的安装

接下来介绍一下具体的应用

使用java + rabbitMQ实现聊天功能的demo , 非常有助于理解和上手rabbitMQ , 该demo仅限于用来学习rabbitMQ , 实际工作中实现聊天功能不推荐使用rabbitMQ

首先创建一个maven项目,然后在pom.xml文件中导入RabbitMQ的jar包

地址如下:

<dependencies>
    <dependency>
	<groupId>com.rabbitmq</groupId>
	<artifactId>amqp-client</artifactId>
	<version>3.6.0</version>
    </dependency>
</dependencies>

工作模式采用-工作队列 接下来具体讲解一下代码实现

首先创建一个类A 并创建连接工厂和创建一个新的连接

//创建连接工厂
		ConnectionFactory factory = new ConnectionFactory();
		//设置RabbitMQ地址
		factory.setHost("localhost");//连接地址
		factory.setUsername("guest");//用户名
		factory.setPassword("guest");//密码
		factory.setPort(5672);//端口号
		//创建一个新的连接
		final Connection connection = factory.newConnection();

然后创建线程T1用来发送消息:

//发送消息线程
Thread t1 = new Thread(new Runnable() {
    public void run() {
	//创建一个频道
	Channel channel = null;
	try {
	    channel = connection.createChannel();
	    //声明要关注的频道
	    channel.exchangeDeclare("logs", "fanout");
	    //channel.queueDeclare(QUEUE_NAME, false, false, false, null);
	} catch (Exception e) {
	    e.printStackTrace();
	}
	while(true) {
	    Scanner scan = new Scanner(System.in);
	    System.out.println("请输入消息");
	    String message = scan.nextLine();
	    //发送消息到队列中
	    try {
		channel.basicPublish("logs", QUEUE_NAME, null, message.getBytes());
		//channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));
	    } catch (Exception e) {
		e.printStackTrace();
	    }
	System.out.println("B发送消息:" + message);
	}
    }
});

创建T2用来监听接收消息:

//接收消息线程
Thread t2 = new Thread(new Runnable() {
    public void run() {
	Channel channel = null;
	try {
		channel = connection.createChannel();
		//声明要关注的频道
		channel.exchangeDeclare("logs", "fanout");
		//channel.queueDeclare(QUEUE_NAME,false,false,false,null);
		channel.queueBind(QUEUE_NAME, "logs", "");
		//创建消费者 ---- 得到消息后会自动触发
		Consumer consumer = new DefaultConsumer(channel) {
			@Override
			public void handleDelivery(
				String consumerTag, Envelope envelope, 
				AMQP.BasicProperties properties, byte[] body
				) throws IOException {
				//body为消息体
				String message = new String(body, "UTF-8");
				System.out.println("B接收消息:" + message);
			}
		};
		//消息消费完成确认
		channel.basicConsume(QUEUE_NAME, true, consumer);
	} catch (Exception e) {
		e.printStackTrace();
	}
    }
});

最后别忘了启动两个线程:

t1.start();
t2.start();

然后我们在创建一个一模一样的类B

public class B {
	private final static String QUEUE_NAME = "test";
	public static void main(String[] args) throws Exception{
		//创建连接工厂
		ConnectionFactory factory = new ConnectionFactory();
		//设置RabbitMQ地址
		factory.setHost("localhost");//连接地址
		factory.setUsername("guest");//用户名
		factory.setPassword("guest");//密码
		factory.setPort(5672);//端口号
		//创建一个新的连接
		final Connection connection = factory.newConnection();
		//发送消息线程
		Thread t1 = new Thread(new Runnable() {
			public void run() {
				//创建一个频道
				Channel channel = null;
				try {
					channel = connection.createChannel();
					//声明要关注的频道
					channel.exchangeDeclare("logs", "fanout");
					//channel.queueDeclare(QUEUE_NAME, false, false, false, null);
				} catch (Exception e) {
					e.printStackTrace();
				}
				while(true) {
					Scanner scan = new Scanner(System.in);
					System.out.println("请输入消息");
					String message = scan.nextLine();
					//发送消息到队列中
					try {
						channel.basicPublish("logs", QUEUE_NAME, null, message.getBytes());
						//channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));
					} catch (Exception e) {
						e.printStackTrace();
					}
					System.out.println("B发送消息:" + message);
				}
			}
		});
		//接收消息线程
		Thread t2 = new Thread(new Runnable() {
			public void run() {
				Channel channel = null;
				try {
					channel = connection.createChannel();
					//声明要关注的频道
					channel.exchangeDeclare("logs", "fanout");
					//channel.queueDeclare(QUEUE_NAME,false,false,false,null);
					channel.queueBind(QUEUE_NAME, "logs", "");
					//创建消费者 ---- 得到消息后会自动触发
					Consumer consumer = new DefaultConsumer(channel) {
						@Override
						public void handleDelivery(
								String consumerTag, Envelope envelope, 
								AMQP.BasicProperties properties, byte[] body
							) throws IOException {
							//body为消息体
							String message = new String(body, "UTF-8");
							System.out.println("B接收消息:" + message);
						}
					};
					//消息消费完成确认
					channel.basicConsume(QUEUE_NAME, true, consumer);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
		t1.start();
		t2.start();
	}
}

然后分别运行两个类:

最后由于本文的demo需要持续监听 , 所以未做关闭连接

如果大家在实际中使用一定记得要关闭连接,不然小心你的内存

}finally {
    try {
	if (channel != null) {
		channel.close();
	}
	if (connection != null) {
		connection.close();
	}
    }catch (Exception e) {
	e.printStackTrace();
    }
}

 

好了 , 这样一个简单的一对一聊天功能就完成了

 

我们也可以用 -- 发布订阅模式 实现多人在线聊天 , 在这里我就不演示了,有兴趣的小伙伴可以自己做一下

好了,本篇文章就到这了

 

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯狂的狮子Li

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值