自己的小项目的聊天信息实时更新的问题解决
使用ajax轮询是最简单的方法,但是从性能上考虑或者实际使用效能上看就不推荐使用,但是毕竟是自己的小项目可以考虑使用的。其次是websocket的使用,它的使用也比较简单。简单是相对的,如果是学习相关方向的那就相对简单,但是自学的就比较难,代码片段分为前端代码(js)和后端代码。
本文档仅提供给想做但是没有方向的人参考,我刚开始想做就因为没有方向搞的很不知所措。
后端代码展示
package com.yunyu.socket;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.yunyu.dao.impl.ChatdataDaoimpl;
import com.yunyu.modle.ChatdataModel;
import org.apache.commons.collections.map.HashedMap;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.Set;
@ServerEndpoint("/websocket/{uid}")
public class UserChatSocket {
//定义监听属性
//定义时间
private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//定义集合存放使用用户(存在状态的session)
//private static Vector<Session> userList = new Vector<Session>();//缺少判断是否有效session
//添加标识功能
private static Map<Integer,Session> userMap = new HashedMap();
//使用service层的数据库服务
private ChatdataDaoimpl chatdataDaoimpl = new ChatdataDaoimpl();
//访问(无操作)
@OnOpen
public void onOpen(Session session, @PathParam("uid")int uid){
System.out.println("用户连接。uid="+uid);
//判断是否已经保存过该用户
if(this.checkUserKey(uid)){//如果保存过
if(!this.checkUserSession(uid,session)){//判断是否是同一个session如果不是同一个session就保存
userMap.put(uid,session);
}
}else {//没保存过就保存
userMap.put(uid,session);
}
}
//文件操作的受响应用户是打开当前页面访问socket的用户
@OnMessage//公共聊天数据
public void onMessage(String msg,Session session){//前段调用,第二参数表示访问者(与前端的send方法的调用呼应),send()方法第二参数
/*
* 公共聊天,无需传入标识session
* 发数据需要传入发送者uid,发送的数据
* 发送内容为发送数据,是否是自己的标示(uid)
* */
//单传
int sendtouid = -1;
//获取传入参数
JSONObject obj = JSON.parseObject(msg);
//设置参值
ChatdataModel chatdata_db = new ChatdataModel();
//获取参数
if(obj.get("datas")!=null){
chatdata_db.setDatas(obj.get("datas")+"");
}
if(obj.get("uid")!=null){
chatdata_db.setUid((int)obj.get("uid"));
}
if(obj.get("sendto")!=null){
sendtouid=(int)obj.get("sendto");
chatdata_db.setSendto(obj.get("sendto")+"");
}
obj.put("date",dateFormat.format(new Date()));
//遍历发送信息
chatdataDaoimpl.addNewData(chatdata_db);
if(sendtouid==0){//0表示群发
for(Session se: userMap.values()){
se.getAsyncRemote().sendText(obj.toJSONString());
}
}else if(sendtouid>0) {//否则单发
userMap.get(sendtouid).getAsyncRemote().sendText(obj.toJSONString());
}
}
//用户断开
@OnClose
public void onClose(Session session){
//userList.remove(session);//在集合中删除这个人
}
//如果有异常的显错
@OnError
public void onError(Throwable e){
e.getMessage();
}
//判断用户是否重复
public boolean checkUserKey(int num){
boolean redata = false;
Set userKey = userMap.keySet();
for(Object k:userKey){
int uid = (int)k;
if(uid==num){
redata=true;
break;
}
}
return redata;
}
//判断用户session是否是对应session
public boolean checkUserSession(int uid,Session session){
if(userMap.get(uid).equals(session)){
return true;
}else {
return false;
}
}
}