1. 程式人生 > >websocket的B/S簡單應用

websocket的B/S簡單應用

一、websocket和http的區別(B/S結構)
1.http:每次請求都要經歷‘建立連線、斷開連線’。開銷大。
這裡寫圖片描述
2.websocket,只需建立一次連線,可以進行多次資料傳輸。開銷小,即使性。
這裡寫圖片描述
二、websocket的倆種結構
1.C/S結構

Cliet/Server,需要使用者安裝客戶端,例如:QQ,QT,MSN等等。

2.B/S結構

Brower/Server,使用者通過瀏覽器和伺服器之間通訊。

三、通過案例瞭解BS模型
1.效果圖
(1)多個使用者登陸
這裡寫圖片描述
(2)登陸的使用者群聊 早進入群聊的可以看到後如群聊的使用者進群聊資訊
這裡寫圖片描述
這裡寫圖片描述
2.程式碼實現
(1)頁面程式碼
1)index.jsp。使用者登陸頁面

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
    <h4
>
登陸頁面</h4> <form action="login" id="login" method="post" > <div></div> <div style="text-align: center;margin-bottom: 10px;"> <label>填寫登陸名:</label><input name="nick" id="nick" > </div> <div style
="text-align:center;float: center;margin-left: 35%;">
<a href="chat.jsp"><button >登陸</button></a> <!-- <div style="text-align: center;background-color: green;width: 250px;height: 25px;"> <a href="javascript:goChat()" style="text-align: center;font-family: fantasy;font-weight: bolder;color: white;">進入聊天室</a> </div> --> </div> </form> </body> <script> /* 校驗輸入框是否有值 */ function goChat(){ if($('#login').form('enableValidation').form('validate')){ $('#login').submit; } } </script> </html>

2)chat.jsp。使用者聊天介面

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
<script type="text/javascript" src="js/jquery.min.js"></script>
</head>
<body style="align='center'">
    <div style="position:absolute;left:20%;transform:translateX(-50%);top:50%;transform:translateY(-50%)">
        <h4>聊天頁面</h4>
        <div
            style="border: solid 1px black; margin: 20px; padding: 20px; width: 500px; height: 450px;overflow:auto;">
            <div>
                <!-- 顯示聊天列表 -->
                <ul id="message"></ul>
            </div>

        </div>
        <div>
                <label>輸入傳送的訊息</label> <input type="text" id="msg" />
                <button onclick="javascript:buttonOnclick();">傳送</button>
            </div>
    </div>
</body>
<!-- 儲存登陸使用者的暱稱 -->
<%
    String nick = (String) request.getAttribute("nick");
%>
<script type="text/javascript">

    var ws = null;
    if(WebSocket){
        //執行下面語句,就建立通道
        ws = new WebSocket("ws://localhost:8080/demo/chat");
    }else{
       alert("瀏覽器不支援");
    }

    //客戶端向伺服器傳送訊息
    ws.onopen = function(){
        ws.send("<span style=\"background-color:yellow;\">使用者【<%=nick%>】加入聊天室</span>");
    }

    //服務端將客戶端的資料返回(頁面接收服務端的訊息)
    ws.onmessage = function(event) {
        console.log(event.data);
        showMessage(event.data);
    }
    function showMessage(msg) {
        var html = $('#message').html();
        html = html + "<li>" + msg + "</li>";
        $('#message').html(html);
        console.info("xxx=" + html);

        //////////////////////////////
        //客戶端,伺服器1對n關係(群聊)
        ///////*新增以下程式碼*//////////
        message.html(html);//追加頁面
        message.scrollTop(message[0].scrollHeight);//顯示最新訊息
    }

    //客戶端手動錄入訊息併發送(點選按鈕傳送)【客戶端,伺服器1對1關係】
    function buttonOnclick(){
        var message = $('#msg').val();
        console.info("msg=" + message);
        ws.send("<p style=\"color:blue;\">[<%=nick%>]說</p>" + message);
        //清空原來的值
        $(this).textbox('clear');
    }
</script>
</html>

(2)java類。
1)ChatServer.java。聊天室的客戶服務端程式碼。

package com.lj.server;

import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

/*申明websocket的名字*/
@ServerEndpoint("/chat")
public class ChatServer {
    // 存放通訊資源的,在message中使用
    private Session session;
    // 用來存放每個客戶端對應伺服器的webSocket物件,程序安全
    private static CopyOnWriteArraySet<ChatServer> servers = new CopyOnWriteArraySet<ChatServer>();

    /* 通道建立成功需要執行的動作 */
    @OnOpen
    public void onOpen(Session session) {
        this.session = session;
        servers.add(this);
        System.out.println("建立連線,sessionId:" + session.getId());
    }

    /* 接受對方的資料 */
    @OnMessage
    public void onMessage(String message) {
        System.out.println("開始接收資料,message:" + message);
        // 伺服器反饋客戶端
        try {
            // 伺服器客戶端1對1
            // this.session.getBasicRemote().sendText(message);

            // 伺服器客戶端1:n(群發)
            for (ChatServer server : servers) {
                server.session.getBasicRemote().sendText(message);
                System.out.println("伺服器反饋資料,message:" + message);
            }
            //System.out.println("伺服器反饋資料,message:" + message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /* 關閉連線 */
    @OnClose
    public void onClose() {
        System.out.println("通道連線關閉");
    }

    @OnError
    public void onError(Session session, Throwable error) {
        servers.remove(this);
        System.out.println("發生錯誤" + error.getStackTrace());
    }
}

2)UserServlet.java.

package com.lj.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class UserServlet extends HttpServlet{

    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        //獲取index的nick,並傳到chat.jsp
        req.setCharacterEncoding("utf-8");
        String nick = req.getParameter("nick");
        req.setAttribute("nick",nick);
        req.getRequestDispatcher("chat.jsp").forward(req, resp);
        System.out.println("post");;

    }
}

配置**UserServlet** 對應的servlet(web.xml)

<servlet>
        <servlet-name>UserServlet</servlet-name>
        <servlet-class>com.lj.servlet.UserServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>UserServlet</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>

(3)專案結構
這裡寫圖片描述
(4)完畢。沒有用CSS,所以介面,很,彆扭。

完整程式碼