1. 程式人生 > >JAVA實現websocket

JAVA實現websocket

什麼是websocket?

傳統的通訊模式是這樣的:客戶端(瀏覽器等)主動向伺服器傳送一個請求,伺服器接收之後,處理這個請求,然後返回一個響應給客戶端。大多數都是客戶端向伺服器傳送請求,而伺服器很難主動向客戶端傳送資料。

websocket實現了瀏覽器與伺服器的全雙工通訊,使服務端也能主動向客戶端傳送資料。

websocket工作流程是這樣的:客戶端向伺服器發出建立websocket連線的請求,在websocket連線建立之後,客戶端和服務端就可以通過TCP連線傳輸資料。

如果在tomcat上部署的話,需要保證版本在Tomcat7.0.47以上。

  • index.jsp
<script type="text/javascript" src="jquery-1.8.3.js"></script>
<script type="text/javascript">
$(function(){
    var websocket = null;

    //判斷瀏覽器是否支援websocket
    if('WebSocket' in window) {
        //如果支援,建立websocket物件,注意url格式
        websocket = new WebSocket('ws://localhost:8080/zhouchenxuan/go'
); }else { alert('瀏覽器版本不支援websocket!'); } //定義連線錯誤的回撥方法 websocket.onerror = function() { alert('websocket連接出錯!'); } //定義連線成功的回撥方法 websocket.onopen = function() { alert('websocket連線成功!'); } //定義websocket關閉的回撥方法 websocket.onclose = function()
{
alert('websocket已關閉!') } //當視窗關閉時,主動去關閉websocket連線 window.onbeforeunload = function() { closeWebSocket(); } //接收到訊息的回撥方法 websocket.onmessage = function(event) { handleMsg(event.data); } $('#send').click(function() { websocket.send($('#input').val()); }); }); //關閉websocket function closeWebSocket() { websocket.close(); } function handleMsg(msg) { $('#msg').append(msg + '\n'); }
</script> <body> <input name="input" id="input" type="text" />&nbsp;<input name="send" id="send" type="button" value="傳送請求" /> <br><hr style="width:50%;" align="left"> <textarea name="msg" id="msg" style="width: 260px;height:190px"></textarea> </body>
  • Test.java
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("/go")
public class Test {

    //concurrent包的執行緒安全Set,用來存放每個客戶端對應的Test物件。
    private static CopyOnWriteArraySet<Test> set = new CopyOnWriteArraySet<Test>();

    //與某個客戶端的連線會話,需要通過它來給客戶端傳送資料
    private Session session;

    /**
     * 連線建立成功呼叫的方法
     * @param session
     */
    @OnOpen
    public void OnOpen(Session session) {
        this.session = session;
        set.add(this);
        System.out.println("OnOpen()方法被執行...");
        System.out.println("websocket連線建立成功...");
        System.out.println();
    }

    /**
     * 連線關閉的方法
     */
    @OnClose
    public void OnClose() {
        set.remove(this);
        System.out.println("OnClose()方法被執行...");
        System.out.println("websocket連線已經關閉...");
        System.out.println();
    }

    /**
     * 接收訊息的方法
     * @param msg
     * @param session
     */
    @OnMessage
    public void OnMessage(String msg, Session session) {
        System.out.println("已從客戶端接收訊息:" + msg);

        //可以做一些複雜邏輯,這裡每秒中傳送一條資料
        for(int i = 0;i < 10;i++) {
            try {
                Thread.currentThread().sleep(1000);
                //向所有客戶端發訊息
                for(Test t : set) {
                    t.sendResponse("這是第" + (i + 1) + "條資訊...");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("向客戶端傳送資料完畢...");
    }

    /**
     * 出錯的方法,注意引數不能錯
     * @param session
     * @param error
     */
    @OnError
    public void OnError(Session session, Throwable error) {
        System.out.println("OnError()方法被執行...");
        System.out.println("websocket出錯...");
        System.out.println();
    }

    //傳送資料到客戶端,這個沒有註解
    public void sendResponse(String str) {
        try {
            System.out.println("sendResponse()方法被執行...");
            this.session.getBasicRemote().sendText(str);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

程式碼複製完了,我們開啟瀏覽器跑一下試試。。。
進入到測試頁面,會提示“連線成功…”
這裡寫圖片描述

輸入一些資訊,然後點選“傳送請求”,後臺就會接收資訊,也會把伺服器的資訊傳送到瀏覽器。
這裡寫圖片描述