網頁實時聊天


整理了一下網頁實時聊天的小練習,留着可能用得到

后台代碼
package www.test;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
 
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
 
import org.apache.catalina.websocket.MessageInbound;
import org.apache.catalina.websocket.StreamInbound;
import org.apache.catalina.websocket.WebSocketServlet;
import org.apache.catalina.websocket.WsOutbound;
 
@WebServlet("/chat")
public class ChatWebSocketServlet extends WebSocketServlet {
    private final Map<Integer, WsOutbound> map = new HashMap<Integer, WsOutbound>();
    private static final long serialVersionUID = -1058445282919079067L;
    @Override
    protected StreamInbound createWebSocketInbound(String arg0, HttpServletRequest request) {
        // StreamInbound:基於流的WebSocket實現類(帶內流),應用程序應當擴展這個類並實現其抽象方法onBinaryData和onTextData。
        return new ChatMessageInbound();
    }
    class ChatMessageInbound extends MessageInbound {
        // MessageInbound:基於消息的WebSocket實現類(帶內消息),應用程序應當擴展這個類並實現其抽象方法onBinaryMessage和onTextMessage。
        @Override
        protected void onOpen(WsOutbound outbound) {
            map.put(outbound.hashCode(), outbound);
            super.onOpen(outbound);
        }
        @Override
        protected void onClose(int status) {
            map.remove(getWsOutbound().hashCode());
            super.onClose(status);
        }
        @Override
        protected void onBinaryMessage(ByteBuffer buffer) throws IOException {
        }
        @Override
        protected void onTextMessage(CharBuffer buffer) throws IOException {
            String msg = buffer.toString();
            Date date = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.SSS");
            msg = " <font color=green>匿名用戶  " + sdf.format(date) + "</font><br/> " + msg;
            broadcast(msg);
        }
        private void broadcast(String msg) {
            Set<Integer> set = map.keySet();
            for (Integer integer : set) {
                WsOutbound outbound = map.get(integer);
                CharBuffer buffer = CharBuffer.wrap(msg);
                try {
                    outbound.writeTextMessage(buffer);
                    outbound.flush();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
 
         

前台頁面:

<body>
    <h2 align="center">歡迎來到聊天室</h2>
    <div align="center">
        <div id="chat">
            <div id="up"></div>
            <div id="down">
                <textarea type="text" id="text" style="width: 100%; height: 40px;"></textarea>
            </div>
        </div>
        <input type="button" value="連接" onclick="chat(this);">
        <input type="button" value="發送" onclick="send(this);" disabled="disabled" id="send_btn" title="Enter發送">
    </div>
</body>


script代碼
<script type="text/javascript">
    var socket;
    var receive_text = document.getElementById("up");
    var send_text = document.getElementById("text");
    function addText(msg) {
        receive_text.innerHTML += "<br/>" + msg;
        receive_text.scrollTop = receive_text.scrollHeight;
    }
    var chat = function(obj) {
        obj.disabled = "disabled";
        socket = new WebSocket('ws://169.254.77.246:8080/chat/chat');
        receive_text.innerHTML += "<font color=green>正在連接服務器……</font>";
        //打開Socket 
        socket.onopen = function(event) {
            addText("<font color=green>連接成功!</font>");
            document.getElementById("send_btn").disabled = false;
            send_text.focus();
            document.onkeydown = function(event) {
                if (event.keyCode == 13 && event.ctrlKey) {
                    send();
                }
            }
        };
        socket.onmessage = function(event) {
            addText(event.data);
        };
 
        socket.onclose = function(event) {
            addText("<font color=red>連接斷開!</font>");
            obj.disabled = "";
        };
        if (socket == null) {
            addText("<font color=red>連接失敗!</font>");
        }
    };
    var send = function(obj) {
        if (send_text.value == "") {
            return;
        }
        socket.send(send_text.value);
        send_text.value = "";
        send_text.focus();
    }

 

所用jar包:tomcat中lib下的包就足夠用了
再加一個javax.mail

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM