基于websocket的多人页面聊天室

这是一个简单的页面聊天室。关于websocket是什么,看看这篇回答吧,要知道它是一个持久化的协议。
在项目中登录注册我就不讲了,直接从聊天室开始吧。

页面js

var socket =null;
var user =null;
function parseObj(strData){//change string to obj
    return (new Function( "return " + strData ))();
};
//dbclick to kick
function userdbClick(obj){
    if(user.type!=""&&user.type=="1"){
        socket.send("kick#"+$(obj).attr("id"));
    }else{
        alert("You can`t kick him/her");
    }
};
//if browser supports WebSocket
   if (!window.WebSocket) {  
       alert("WebSocket not supported by this browser!"); 
   }  
$(function(){  
    if('${user}'==""){
        alert("please login in ");
        window.location.href="login.jsp"; 
    }else{
        user = eval('(' + '${user}' + ')');
        $("#myname").text(user.name);
        var myt;
        if(user.type==1){
            myt="Admin";
        }else{
            myt="User";
        }
        $("#mytype").text(myt);
        //create socket object
        socket = new WebSocket("ws://"+ window.location.host+"/${pageContext.request.contextPath}/chat");
        socket.onopen = function() {
            $("#showMsg").append("Connection Successful...<br/>");
            socket.send("add#"+user.id);
        };
        socket.onmessage = function(message) {
            var data=parseObj(message.data);
            //if have been kicked ,goto login.jsp
            if(typeof(data.type)!= "undefined"){
                if(data.type=="kick"){
                    alert(data.message);
                    window.location.href="login.jsp"; 
                    return;
                }
            }
            //show the msg to screen
            $("#showMsg").append("<span style='display:block'>"+data.message+"</span>");
            //update the user list while receive the msg from server
            var users=data.users;
            if(typeof(users)!= "undefined"){
                $("#users").empty();
                $("#users").append("<option value='0'>all</option>");
                $("#userlist").empty();
                $.each( users, function(i, n){
                      if(n.id==user.id){
                      }else{
                          $("#users").append("<option value='"+n.id+"'>"+n.name+"</option>");
                      }
                      var t=n.type==1;
                      if(n.id==user.id){
                          alert("<c:if test='"+n.type+"==1'>A--</c:if>");
                          $("#userlist").append("<p id='"+n.id+"'  class='my'><c:choose><c:when test='"+t+"'>A--</c:when><c:otherwise>U--</c:otherwise></c:choose>"+n.name+"</p>");
                      }else{
                        $("#userlist").append("<p id='"+n.id+"' ondblclick='userdbClick(this);'><c:choose><c:when test='"+t+"'>A--</c:when><c:otherwise>U--</c:otherwise></c:choose>"+n.name+"</p>");
                      }
                });
            }
        };
        //when leave the page
        socket.onclose = function(){
            <%session.setAttribute("user","");%>  
            socket.send('leave#');
            window.location.href="login.jsp"; 
        };
        //when error
        socket.onerror = function() {
            alert("error");
        };
        //send msg to others or only one
        $("#sendButton").click(function() {
            if($("#users").val()!=0){
                socket.send("sendone#"+$("#msg").val()+"#"+$("#users").val());
            }else{
                socket.send("sendall#"+$("#msg").val());
            }
            $("#msg").val("");
        });
        //leave the chat room
        $("#leaveButton").click(function(){
            window.location.href="login.jsp"; 
            socket.send('leave');
        });
        //change the user state
        $("#state").change(function(){
            var state=$("#state").val();
            socket.send("state#"+state);
        });
    }
});

server java

这个类中的方法基本与js中的对应,这个OnMessage方法主要是根据页面传过来的数据进行分类处理

    @OnMessage
    public void onMessage(String unscrambledWord, Session session, EndpointConfig config){
        String[] str=unscrambledWord.split("#");
        User user=getUserBySession(session);
        if("leave".equals(str[0])){//user leave
            user.getHttpSession().setAttribute("user", "");
        }else if("sendone".equals(str[0])){//send one user
            JSONObject json=new JSONObject();
            json.put("message", "["+new Date()+"]"+user.getName()+" send to "+userList.get(str[2]).getName()+"<br/>"+str[1]);
            broadcastToOne(json,str[2],user);
        }else if("sendall".equals(str[0])){//send all users
            JSONObject json=new JSONObject();
            json.put("message", "["+new Date()+"]"+user.getName()+"<br/>"+str[1]);
            broadcastAllUser(json);
        }else if("add".equals(str[0])){//new user come in
            userList.get(str[1]).setSession(session);
            JSONObject json=new JSONObject();
            String welcome="*****welcome,"+userList.get(str[1]).getName()+"! *****";
            json.put("message", welcome);
            json.put("users", getUserList());
            broadcastAllUser(json);
        }else if("state".equals(str[0])){//change user`s state
            user.setState(str[1]);
        }else if("kick".equals(str[0])){//kick user
            if(user.getType().equals("1")){
                String outid=str[1];
                JSONObject json=new JSONObject();
                json.put("message", "You been kicked !");
                json.put("type", "kick");
                user.getHttpSession().setAttribute("user", "");
                kick(json,outid);
            }
        }else{
            JSONObject json=new JSONObject();
            json.put("message", user.getName()+"   "+new Date()+unscrambledWord);
            broadcastAllUser(json);
        }

    }

demo 下载地址:http://download.csdn.net/detail/wujiaoyan0423/9506595

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值