自己的小项目的聊天信息实时更新的问题解决

自己的小项目的聊天信息实时更新的问题解决

使用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;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值