天天看點

Java 與 JavaScript 對websocket的使用

傳統 HTTP 請求響應用戶端伺服器互動圖

Java 與 JavaScript 對websocket的使用

WebSocket 請求響應用戶端伺服器互動圖

Java 與 JavaScript 對websocket的使用

浏覽器

支援情況

Chrome

Chrome version 4+支援

Firefox

Firefox version 5+支援

IE

IE version 10+支援

Safari

IOS 5+支援

Android Brower

Android 4.5+支援

webSocket消息推送例子

pom.xml

Java 與 JavaScript 對websocket的使用

<!-- webSocket -->  

<dependency>  

    <groupId>javax</groupId>  

    <artifactId>javaee-api</artifactId>  

    <version>7.0</version>  

</dependency>  

(tomcat7.027開始支援websocket,但是tomcat7.047開始才能使用注解形式的websoket,從該版本開始websoket被內建進入了javaee7中)

java代碼:

Java 與 JavaScript 對websocket的使用

package com.student.system.listen;  

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;  

@ServerEndpoint("/websocket")  

public class WebSocketListen {  

    // 靜态變量,用來記錄目前線上連接配接數。應該把它設計成線程安全的。  

    private static int onlineCount = 0;  

    // concurrent包的線程安全Set,用來存放每個用戶端對應的MyWebSocket對象。若要實作服務端與單一用戶端通信的話,可以使用Map來存放,其中Key可以為使用者辨別  

    private static CopyOnWriteArraySet<WebSocketListen> webSocketSet = new CopyOnWriteArraySet<WebSocketListen>();  

    // 與某個用戶端的連接配接會話,需要通過它來給用戶端發送資料  

    private Session session;  

    /** 

     * 連接配接建立成功調用的方法 

     *  

     * @param session 

     *            可選的參數。session為與某個用戶端的連接配接會話,需要通過它來給用戶端發送資料 

     */  

    @OnOpen  

    public void onOpen(Session session) {  

        this.session = session;  

        webSocketSet.add(this); // 加入set中  

        addOnlineCount(); // 線上數加1  

        System.out.println("有新連接配接加入!目前線上人數為" + getOnlineCount());  

    }  

     * 連接配接關閉調用的方法 

    @OnClose  

    public void onClose() {  

        webSocketSet.remove(this); // 從set中删除  

        subOnlineCount(); // 線上數減1  

        System.out.println("有一連接配接關閉!目前線上人數為" + getOnlineCount());  

     * 收到用戶端消息後調用的方法 

     * @param message 

     *            用戶端發送過來的消息 

     *            可選的參數 

    @OnMessage  

    public void onMessage(String message, Session session) {  

        System.out.println("來自用戶端的消息:" + message);  

        // 群發消息  

        for (WebSocketListen item : webSocketSet) {  

            try {  

                item.sendMessage(message);  

            } catch (IOException e) {  

                e.printStackTrace();  

                continue;  

            }  

        }  

     * 發生錯誤時調用 

     * @param error 

    @OnError  

    public void onError(Session session, Throwable error) {  

        System.out.println("發生錯誤");  

        error.printStackTrace();  

     * 這個方法與上面幾個方法不一樣。沒有用注解,是根據自己需要添加的方法。 

     * @throws IOException 

    public void sendMessage(String message) throws IOException {  

        this.session.getBasicRemote().sendText(message);  

        // this.session.getAsyncRemote().sendText(message);  

    public static synchronized int getOnlineCount() {  

        return onlineCount;  

    public static synchronized void addOnlineCount() {  

        WebSocketListen.onlineCount++;  

    public static synchronized void subOnlineCount() {  

        WebSocketListen.onlineCount--;  

}  

JSP頁面

Java 與 JavaScript 對websocket的使用

<%@ page language="java" contentType="text/html; charset=UTF-8"  

    pageEncoding="UTF-8"%>  

<html>  

<head>  

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  

<title>websocket</title>  

</head>  

<body>  

    Welcome<br/>  

    <input id="text" type="text"/>  

        <button onclick="send()">發送消息</button>  

        <hr/>       

        <button onclick="closeWebSocket()">關閉WebSocket連接配接</button>  

        <hr/>  

        <div id="message"></div>  

  <script type="text/javascript">  

    var websocket = null;  

       //判斷目前浏覽器是否支援WebSocket  

       if ('WebSocket' in window) {  

          websocket = new WebSocket("ws://localhost:8028/ThesisManage/websocket");  

      }  

      else {  

          alert('目前浏覽器 Not support websocket')  

      //連接配接發生錯誤的回調方法  

      websocket.onerror = function () {  

           setMessageInnerHTML("WebSocket連接配接發生錯誤");  

      };  

       //連接配接成功建立的回調方法  

       websocket.onopen = function () {  

           setMessageInnerHTML("WebSocket連接配接成功");  

       }  

      //接收到消息的回調方法  

       websocket.onmessage = function (event) {  

           setMessageInnerHTML(event.data);  

       //連接配接關閉的回調方法  

       websocket.onclose = function () {  

          setMessageInnerHTML("WebSocket連接配接關閉");  

       //監聽視窗關閉事件,當視窗關閉時,主動去關閉websocket連接配接,防止連接配接還沒斷開就關閉視窗,server端會抛異常。  

       window.onbeforeunload = function () {  

           closeWebSocket();  

       //将消息顯示在網頁上  

       function setMessageInnerHTML(innerHTML) {  

          document.getElementById('message').innerHTML += innerHTML + '<br/>';  

      //關閉WebSocket連接配接  

       function closeWebSocket() {  

           websocket.close();  

       //發送消息  

       function send() {  

          var message = document.getElementById('text').value;  

          websocket.send(message);  

  </script>  

</body>  

</html>  

頁面效果:

Java 與 JavaScript 對websocket的使用
Java 與 JavaScript 對websocket的使用