zoukankan      html  css  js  c++  java
  • java websocket 简单的聊天室

    1, 前端代码 登入页 -> login.html

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>聊天室登入接口</title>
        <script type="text/javascript" src="JavaScript/jQuery.js"></script>
    </head>
    <body>
        请输入账号名: <input id="UserName" type="text" value="">
        <input id="Submit" type="submit" value="登入">
    </body>
    <script type="text/javascript">
        $('#Submit').on('click', function(){
            var userName = $('#UserName').val().trim();
            if(userName == ''){
                console.error("账号名不能为空")
                return;
            }
            location.href = "ChatRoom.html?UserName=" + userName;
        });
    </script>
    </html>

    2, 前端代码 聊天页面 -> ChatRoom

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>聊天室</title>
        <script type="text/javascript" src="JavaScript/jQuery.js"></script>
        <style type="text/css">
            *{ margin: 0; padding: 0; outline: none; border: none; float: left;}
            #Chat{
                width: 800px;
                height: 600px;
                border: 1px solid #000000;
                margin: 20px 0 0 20px;
            }
            #Content{
                width: 600px;
                height: 400px;
                overflow-y: scroll;
                border-bottom: 1px solid black;
                border-right: 1px solid black;
            }
            .ContentList{
                width: 100%;
                border-bottom: 1px solid #CCC;
                padding: 5px 0 10px 0; 
            }
            .User{
                width: 30%;
                line-height: 20px;
                font-size: 16px;
                color: red;
                text-indent: 10px;
            }
            .Time{
                width: 70%;
                line-height: 20px;
                font-size: 14px;
                text-indent: 10px;
            }
            .Text{
                margin: 8px 0 0 0;
                width: 100%;
                line-height: 20px;
                font-size: 14px;
                text-indent: 28px;
            }
            #UserList{
                border-bottom: 1px solid black;
                height: 400px;
                width: 199px;
                overflow-y: scroll;
            }
            #UserList > div{
                width: 100%;
                line-height: 28px;
                font-size: 16px;
                text-indent: 32px;
                color: green;
                border-bottom: 1px solid #CCC;
            }
            #InputFrame{
                width: 800px;
                height: 199px;
            }
            .input{
                width: 98%;
                height: 169px;
                display: block;
                line-height: 30px;
                font-size: 18px;
                font-weight: bold;
                padding: 0 0 0 2%;
                border-bottom: 1px solid #CCC;
            }
            .submit{
                width: 100px;
                height: 29px;
                padding: 5px;
                float: right;
                margin: 0 0 0 10px;
            }
        </style>
    </head>
    <body>
        <div id="Chat">
            <div id="Content">
                
            </div>
            <div id="UserList">
    
            </div>
            <div id="InputFrame">
                <textarea class="input"></textarea>
                <input class="submit" type="button" value="发送">
                <input class="submit" type="button" value="取消">
            </div>
        </div>
    </body>
    <script type="text/javascript">
        // GET 传值的获取方法 
        (function($){
            var url = location.search.substring(1);
            var atr = url.split('&');
            var value = {};
            for(var i = 0; i < atr.length; i ++){
                value[atr[i].split('=')[0]] = decodeURIComponent(atr[i].split('=')[1]);
            }
            $.extend({
                GetUrlValue : function(key){
                    return  value[key];
                }
            });
        })(jQuery);
        
        // 创建 WebSocket 的方法 
        function createWebSocket(urlValue){
            if("WebSocket" in window){
                return new WebSocket(urlValue);
            } 
            if ("MozWebSocket" in window){
                return new MozWebSocket(urlValue);
            }
            console.error("浏览器不支持 WebSocKet");
        }
        
        // 构建请求的地址
        var requestUrl = "ws://192.168.0.103/WebTest/ChatRoomForWebSocket?UserName=" + $.GetUrlValue("UserName");
        var webSocket = createWebSocket(requestUrl);
        webSocket.onmessage = function(e){
            console.log(e.data);
            if(e.data == "error"){
                alert("用户名已经被占用,请重新登入!");
                location.href = "Login.html";
            }
            e = $.parseJSON(e.data);
            if(e.type == '0'){
                var data = e.data;
                var str = "";
                for(var i = 0; i < data.length; i++){
                    str += '<div>'+ data[i].name +'</div>';
                }
                $('#UserList').html(str);
            }
            if(e.type == '1'){
                var data = e.data;
                var str = '<div class="ContentList">';
                str += '<div class="User">'+ data.name +'</div>';
                str += '<div class="Time">'+ data.time +'</div>';
                str += '<div class="Text">'+ data.msg +'</div>';
                str += '</div>';
                $('#Content').append(str);
            }
        }
        
        $('.submit').on('click', function(){
            var inputValue = $(this).val();
            if(inputValue == "发送"){
                var sendValue = $('.input').val().trim();
                if(sendValue == ''){
                    alert("发送内容不能为空");
                } else {
                    // 将换行符替换为 <br> 标签
                    sendValue = sendValue.replace(/
    /g, "<br>");
                    webSocket.send(sendValue);
                }
            }
            $('.input').val('');
        });
    </script>
    </html>

    3, JAVA后台处理代码 WebSocket需要配置才能起作用,

      如何配置请参考另一篇 http://www.cnblogs.com/lovling/p/6716612.html

    package socket_web;
    
    import java.io.UnsupportedEncodingException;
    import java.net.URLDecoder;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    import javax.websocket.OnClose;
    import javax.websocket.OnMessage;
    import javax.websocket.OnOpen;
    import javax.websocket.Session;
    import javax.websocket.server.ServerEndpoint;
    
    @ServerEndpoint("/ChatRoomForWebSocket")
    public class ChatRoomForWebSocket {
        public static List<String> userNames = new ArrayList<String>();
        public static List<Session> sessions = new ArrayList<Session>();
    
        @OnOpen
        public void open(Session session) {
            try {
                String userName = session.getQueryString();
                userName = userName.split("=")[1];
                userName = URLDecoder.decode(userName, "utf-8");
                
                if (userNames.contains(userName)) {
                    session.getBasicRemote().sendText("error");
                } else {
                    userNames.add(userName);
                    sessions.add(session);
                    String msg = "{"type":0, "data":[" + jsonName() + "]}";
                    pushMsg(msg);
                }
                System.out.println(userName + " 登入了");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        @OnClose
        public void close(Session session) {
            try {
                String userName = session.getQueryString();
                userName = userName.split("=")[1];
                userName = URLDecoder.decode(userName, "utf-8");
                if (sessions.contains(session)){
                    userNames.remove(userName);
                    sessions.remove(session);
                }
                String msg = "{"type":0, "data":[" + jsonName() + "]}";
                pushMsg(msg);
            } catch (Exception e) {
                System.out.println("关闭失败");
            }
        }
    
        @OnMessage
        public void message(Session session, String msg) {
            try {
                String userName = session.getQueryString();
                userName = userName.split("=")[1];
                userName = URLDecoder.decode(userName, "utf-8");
                Date date = new Date();
                SimpleDateFormat timeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String time = timeFormat.format(date);
                msg = "{"type":1, "data":{"name":"" + userName + "", "msg":"" + msg + "","time":"" + time
                        + "" }}";
                pushMsg(msg);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
    
        // 推送消息给所有用户
        public static void pushMsg(String msg) {
            try {
                for (Session session : sessions) {
                    session.getBasicRemote().sendText(msg);
                }
            } catch (Exception e) {
                System.out.println("发送失败");
            }
        }
    
        // 拼接所有用户名
        public static String jsonName() {
            StringBuilder nameStr = new StringBuilder(100);
            for (String name : userNames) {
                nameStr.append("{"name":"" + name + ""},");
            }
            nameStr.delete(nameStr.length() - 1, nameStr.length());
            return nameStr.toString();
        }
    }
  • 相关阅读:
    selenium 资料
    SpringMVC上传文件总结
    java 获取当天(今日)零点零分零秒
    存储过程实例基于postgersql
    为webService添加Interceptor(拦截器)
    spring+redis实例(二)
    hibernate字段映射枚举类型
    WordPress 在Ubuntu下安装插件、主题输入FTP后无法创建目录
    spring + redis 实例(一)
    mybatis字段映射枚举类型
  • 原文地址:https://www.cnblogs.com/lovling/p/6719461.html
Copyright © 2011-2022 走看看