傳統 HTTP 請求響應用戶端伺服器互動圖
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiInBnauEDO3ImM3czY3MmZkFTZ1ETO1MTM5UDZyMWMiJDZiljMfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.jpg)
WebSocket 請求響應用戶端伺服器互動圖
浏覽器
支援情況
Chrome
Chrome version 4+支援
Firefox
Firefox version 5+支援
IE
IE version 10+支援
Safari
IOS 5+支援
Android Brower
Android 4.5+支援
webSocket消息推送例子
pom.xml
<!-- webSocket -->
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
</dependency>
(tomcat7.027開始支援websocket,但是tomcat7.047開始才能使用注解形式的websoket,從該版本開始websoket被內建進入了javaee7中)
java代碼:
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頁面
<%@ 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>
頁面效果: