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) {@Overridepublic 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) {@Overridepublic 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();}
}
好了 , 这样一个简单的一对一聊天功能就完成了
我们也可以用 -- 发布订阅模式 实现多人在线聊天 , 在这里我就不演示了,有兴趣的小伙伴可以自己做一下
好了,本篇文章就到这了
java+rabbitMQ实现一对一聊天相关推荐
- JAVA中webSockt一对一聊天
JAVA中实现websockt一对一聊天 WebSocketConfig 配置 /*** 开启WebSocket支持* @author*/ @Configuration public class We ...
- 【Java线程】简单实现带界面的一对一聊天
实现原理: 1.构建好窗体,在窗体中创建好相应的布局和控件: 2.为相应的控件(按钮:监听.连接.发送)添加事件: 3.使用到两个线程: a.监听线程:获取服务器端输入的端口号,构建socket,监听 ...
- Java网络编程,一对一聊天
Java网络编程,一对一聊天 **这个小任务是来自于B站,他的视频名字就是"Java实现实时聊天互动程序"** 要求:就是有2个类,其中一个客户端和一个服务端.要实现从客户端发消息 ...
- Java websocket + redis 实现多人单聊天室,多人多聊天室, 一对一聊天
多人,单聊天室版 FEATURE 多人聊天, 界面简洁美观, 使用ueditor支持发送文字,图片信息 群聊成员列表, 登入登出公告 存储聊天记录, 查看历史消息 技术点 使用CopyOnWriteM ...
- 利用websocket实现一对一聊天
一对一聊天websocket 1. 效果展示 2. 业务分析(逻辑展示...) 3. 技术点 功能 即时发送消息||随时发送消息 历史消息显示 已读未读状态 1. 效果展示 由于没做登录,就以jack ...
- 一对一聊天ajax实现
前端页面: 好友列表: 好友列表代码: <%@ page language="java" contentType="text/html; charset=UTF-8 ...
- Java+Springboot+Websocket在线聊天室
1.什么是websocket? websocket是由HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯.它是一种在单个TCP连接上进行全双工通信的协议.W ...
- Java Swing中的聊天气泡
本文将向您解释"如何在Java swing应用程序中绘制聊天气泡?" 聊天气泡与呼出气泡或思想气泡相同. 今天,大多数聊天应用程序都以这种格式显示转换,因此本文将帮助您在用Java ...
- tornado实现基于websocket的好友一对一聊天功能
做项目的时候涉及到即时通信了,所以在 gladuo 的建议下看了一篇教程,[转]Tornado 搭建基于 WebSocket 的聊天服务,经过一番修改调试实现了功能,在此总结分享一下. 按思路来聊: ...
- 微信升级最新版本后,可在一对一聊天场景中访问外部链接
9月17日消息,据微信发布的消息,近期,工信部对外链管理提出了专项指导意见,微信将落实"以安全为底线"的互联互通,为确保高质量的平台内容和良好的用户体验,整体遵循如下外链开放原则: ...
最新文章
- python2基础教程廖雪峰云-Python基础
- bzoj1230[Usaco2008 Nov]lites 开关灯*
- 写在2013年最后一天
- 宝宝的成长脚印8/27
- 1、登录模块测试用例
- 单片微机计算机原理与接口技术高峰,单片微机原理与接口技术(第2版)
- K-折交叉验证(原理及实现)
- Centos7.5安装redis
- 正态分布随机数产生方法
- Redis系列(五):Redis的过期键删除策略
- html如何设置ie6兼容性视图,IE6浏览器兼容性视图设置在哪里
- 几块钱的超声波也能仿真?ROS2仿真之添加超声波传感器
- 阿里开发者工具盘点:用它!让开发事半功倍
- 大数据或成大金融时代的奠基石
- python中用什么函数读取字符串_Python(2)字符串的主要方法
- 做网站如何申请网站空间?
- POJ1036 Gangsters
- Mysql错误1452 - Cannot add or update a child row: a foreign key constraint fails 怎么办?
- mysql 建表语句 及完整案例
- 架构设计:系统存储(20)——图片服务器:需求和技术选型(2)