------------------2019-4-17---------------
优化界面后 移动端运行如图:
网页端运行如图,主要分辨率调成手机端适应的了,网页的不缩放的话有点大。
------------------2019-4-17---------------
----------------2019-4-16-------------------
后续尝试了一下发现网页上的通讯还是要依赖于WebSocket进行实时通讯,C/S层面的纯后端实现的话可以直接用发布/订阅完成,和观察者模式比较类似。
在尝试WebSocket的过程中也碰到比较多问题,顺便把项目和之前学的springCloud放一起巩固了一下,但是最后用maven打包成jar在本地运行是没问题的,但是放到服务器上就连接不上WebSocket,解决了这个问题后我会再发第二篇完整的。
如果加入聊天记录的话就好像QQ群的功能,实现上主要依赖了Redis的发布/订阅。
本实现是由Redis精准地将消息发送给订阅了频道的WebSocket,再由各自的WebSocket发送消息给各自的前端接收。
还有一种单纯用WebSocket来实现,是直接将消息发送给自己的WebSocket,再由自己的消息处理中调用别的WebSocket的推送消息方法。
现在本地运行成功的效果如下:
----------------2019-4-16-------------------
闲着想用redis来做点什么玩玩,有一个发布-订阅模式比较适合用来做聊天室,网上的这类资料也比较多,于是有了这篇博客。
此博客只是基础功能的实现,如果有什么问题,感谢指导。
Redis的配置安装
1)https://github.com/MicrosoftArchive/redis/releases下载Windows的Redis版本
配置文件网上也比较多,关注几点
port端口默认6379
bind主机默认127.0.0.1
dir数据库存放目录 ./默认当前
requirepass 密码默认为空
简单测试下暂时就不修改了
2)将文件解压然后设置环境变量就不用多说了吧
3)创建带配置文件的Redis服务
redis -server.exe --service-install redis.windows.conf
Redis客户端连接测试
cmd中输入
redis-cli –h 127.0.0.1 –p 6379
主机与端口在配置文件中配置,弱配置了密码,则需要再加一句
-a password(配置的密码)
Java使用Jedis
Jedis是Java中操作Redis的工具类,所以我们需要再Maven中引入
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
第一次使用并不清楚哪个版本稳定好用,这里版本选择2.9.0,只是因为看到Maven库里面这个版本用的人最多~
创建Jedis工具类
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
* @author : cjd
* @description : Redis工具类
* @date : 15:29 2019/4/11
*/
public class RedisUtil {
//服务器IP地址
private static String ADDR = "127.0.0.1";
//端口
private static int PORT = 6379;
//密码
private static String AUTH = "";
//连接实例的最大连接数
private static int MAX_ACTIVE = 1024;
//控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。
private static int MAX_IDLE = 200;
//等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException
private static int MAX_WAIT = 10000;
//连接超时的时间
private static int TIMEOUT = 10000;
// 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
private static boolean TEST_ON_BORROW = true;
private static JedisPool jedisPool = null;
/**
* @author : cjd
* @description : 初始化Jedis连接池
* @date : 15:30 2019/4/11
*/
static {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(MAX_ACTIVE);
config.setMaxIdle(MAX_IDLE);
config.setMaxWaitMillis(MAX_WAIT);
config.setTestOnBorrow(TEST_ON_BORROW);
jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT);
//如果设置了密码使用jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT, AUTH);
}
/**
* @author : cjd
* @description : 这里我用了同步获取Jedis实例,不然多线程下同是获取jedis实例不确定会不会出问题
* @date : 15:30 2019/4/11
*/
public synchronized Jedis getJedis() {
if (jedisPool != null) {
Jedis resource = jedisPool.getResource();
return resource;
} else {
return null;
}
}
/**
* @author : cjd
* @description : 释放资源
* @date : 15:34 2019/4/11
*/
public void closeJedisPool(Jedis jedis) {
if (jedis.isConnected()) {
jedis.disconnect();
}
jedis.close();
}
}
1)测试Jedis
2)测试Redis的发布订阅模式
订阅者订阅了频道java后,当发布者发布信息的同时订阅者就收到了消息内容。
Jedis 发布订阅
1)创建订阅者
package redis;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;
/**
* @author :cjd
* @description:
* @create 2019-04-11 16:08
**/
public class Subscriber extends JedisPubSub implements Runnable {
private String channel;
public Subscriber(String channel) {
this.channel = channel;
}
@Override
public void onMessage(String channel, String message) { //收到消息会调用
System.out.println("我收到了来自" + channel + "的消息:" + message);
}
@Override
public void onSubscribe(String channel, int subscribedChannels) { //订阅了频道会调用
System.out.println("我订阅了" + channel);
}
@Override
public void onUnsubscribe(String channel, int subscribedChannels) { //取消订阅 会调用
System.out.println("我取消订阅了" + channel);
}
public void run() {
//开一个线程去订阅,不然会占用主线程运行
Jedis jedis = null;
try {
jedis = RedisUtil.getJedis();
jedis.subscribe(this, channel);
} catch (Exception e) {
System.out.println("订阅失败");
} finally {
if (jedis != null) {
jedis.close();
}
}
}
}
2)创建发布消息静态方法
/**
* @author : cjd
* @description : 发布消息
* @params : [channel, message]
* @param channel 频道
* @param message 消息内容
* @return :void
* @date : 16:33 2019/4/11
*/
public static void publish(String channel, String message) {
Jedis jedis = getJedis();
jedis.publish(channel, message);
closeJedisPool(jedis);
}
3)测试发布订阅