spring低版本系統嵌入websocket

一、pom.xml添加相關依賴包

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.11</version>

<scope>test</scope>

</dependency>

<dependency>

<groupId>javax</groupId>

<artifactId>javaee-api</artifactId>

<version>7.0</version>

<scope>provided</scope>

</dependency>

<dependency>

<groupId>org.aspectj</groupId>

<artifactId>aspectjweaver</artifactId>

<version>1.8.10</version>

</dependency>


二、spring.xml(根據你自己的想而定)引websocket掃描包



三、新建包以及類

package phis.source.WSKService;

import com.alibaba.druid.filter.AutoLoad;

import com.alibaba.fastjson.JSONObject;

import javax.websocket.*;

import javax.websocket.server.ServerEndpoint;

import java.io.IOException;

import java.util.Map;

import java.util.concurrent.CopyOnWriteArraySet;

/**

* @ServerEndpoint 注解是一個類層次的注解,它的功能主要是將目前的類定義成一個websocket服務器端,

* 注解的值將被用于監聽用戶連接的終端訪問URL地址,客戶端可以通過這個URL來連接到WebSocket服務器端

*/

@AutoLoad

@ServerEndpoint("/websocket")

public class WebSocketTest {

//靜態變量,用來記錄當前在線連接數。應該把它設計成線程安全的。

? private static int onlineCount =0;

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

? private static CopyOnWriteArraySetwebSocketSet =new CopyOnWriteArraySet();

//與某個客戶端的連接會話,需要通過它來給客戶端發送數據

? private Sessionsession;

/**

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

? ? * @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 客戶端發送過來的消息

? ? * @param session 可選的參數

? ? */

? @OnMessage

? public void onMessage(String message, Session session) {

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

//群發消息

? ? ? for(WebSocketTest item:webSocketSet){

try {

item.sendMessage(message);

}catch (IOException e) {

e.printStackTrace();

continue;

}

}

}

/**

? ? * 發生錯誤時調用

? ? * @param session

? ? * @param error

? ? */

? @OnError

? public void onError(Session session, Throwable error){

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

error.printStackTrace();

}

/**

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

? ? * @param message

? ? * @throws IOException

*/

? public void sendMessage(String message)throws IOException{

for(WebSocketTest item:webSocketSet){

try {

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

}catch (IOException e) {

e.printStackTrace();

continue;

}

}

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

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

? }

/**

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

? ? * @param message

? ? * @throws IOException

*/

? public void sendMessage(Map message)throws IOException{

for(WebSocketTest item:webSocketSet){

try {

//org.json.JSONObject jsonObject = new org.json.JSONObject(message);

//JSONObject jsonObject = JSONObject

//JSONObject obj = ;

? ? ? ? ? ? item.session.getBasicRemote().sendText(JSONObject.toJSONString(message));

}catch (IOException e) {

e.printStackTrace();

continue;

}

}

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

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

? }

public static synchronized int getOnlineCount() {

return onlineCount;

}

public static synchronized void addOnlineCount() {

WebSocketTest.onlineCount++;

}

public static synchronized void subOnlineCount() {

WebSocketTest.onlineCount--;

}

}


四.業務調用webcosket

1.引入并自動注入

2.主動發送客戶端

webSocketTest.sendMessage(body);


五.客戶端實現websocket

var websocket =null;

//判斷當前瀏覽器是否支持WebSocket

var domain =GetUrlPath();

if ('WebSocket' in window) {

websocket =new WebSocket("ws://"+domain);

}

else {

alert('當前瀏覽器不支持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 + '
';

? ? alert(innerHTML);

}

//關閉WebSocket連接

function closeWebSocket() {

websocket.close();

}

//發送消息

function send() {

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

//websocket.send(message);

}

function onhuiche(e) {

var e = e ||window.event;

if(e.keyCode ==13){

this.send();

}

}

function GetUrlPath() {

var url =document.location.toString();

var arrUrl =url.split("http://");

return arrUrl[1]+"websocket";

}

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容