springBoot socket

做個(gè)SpringBoot Socket使用的簡單記錄

功能:后臺實(shí)時(shí)向前臺發(fā)送提醒信息

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.2.3</version>
            <classifier>jdk15</classifier><!-- jdk版本 -->
        </dependency>

    </dependencies>
@Component
@ServerEndpoint("/msg/{userID}")
public class MsgSocket {

    private static final Logger logger = LoggerFactory.getLogger(MsgSocket.class);
    private static Map<String, Session> clients = new ConcurrentHashMap<>();

    @OnOpen
    public void open(@PathParam("userID")String userID,Session session) {
        clients.put(userID, session);
        logger.info("userID:{},session:{}",userID,session.getAsyncRemote());
    }

    @OnMessage
    public void onMessage(String message) throws IOException {
        JSONObject jsonTo = JSONObject.fromObject(message);
        String msg = (String) jsonTo.get("message");
        String userID = (String) jsonTo.get("userID");

        sendMessageTo(msg,userID);

    }

    private void sendMessageTo(String message, String userID) throws IOException {
        Session session = clients.get(userID);

        if (session == null) {
            return;
        }

        session.getAsyncRemote().sendText(message);
    }

    @OnError
    public void onError(Session session, Throwable error) {
        error.printStackTrace();
    }
@Configuration
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}
@RestController
public class TestController {

    @GetMapping("/test")
    public String test() throws IOException {

        MsgSocket msgSocket = new MsgSocket();
        JSONObject jo = new JSONObject();
        jo.put("message", "這是后臺返回的消息!");
        jo.put("userID","huang");
        msgSocket.onMessage(jo.toString());

        return "success";
    }
}

用一個(gè)簡單頁面做測試

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<script>
    var websocket = null;

    var host = document.location.host;

    var username = "huang"; // 獲得當(dāng)前登錄人員的userName

    // alert(username)

    //判斷當(dāng)前瀏覽器是否支持WebSocket

    if ('WebSocket' in window) {

        alert("瀏覽器支持Websocket"+host)

        websocket = new WebSocket('ws://' + 'localhost:8080' + '/msg/' + username);
        alert('ws://' + 'localhost:8080' + '/msg/' + username)

    } else {

        alert('當(dāng)前瀏覽器 Not support websocket')

    }


    //連接發(fā)生錯(cuò)誤的回調(diào)方法

    websocket.onerror = function (e) {

        alert(e)

        alert("WebSocket連接發(fā)生錯(cuò)誤")

        setMessageInnerHTML("WebSocket連接發(fā)生錯(cuò)誤");

    };


    //連接成功建立的回調(diào)方法

    websocket.onopen = function () {

        alert("WebSocket連接成功")

        setMessageInnerHTML("WebSocket連接成功");

    }


    //接收到消息的回調(diào)方法

    websocket.onmessage = function (event) {

        alert("接收到消息的回調(diào)方法")

        alert("這是后臺推送的消息:" + event.data);

        websocket.close();

        alert("webSocket已關(guān)閉!")

    }


    //連接關(guān)閉的回調(diào)方法

    websocket.onclose = function () {

        setMessageInnerHTML("WebSocket連接關(guān)閉");

    }


    //監(jiān)聽窗口關(guān)閉事件,當(dāng)窗口關(guān)閉時(shí),主動(dòng)去關(guān)閉websocket連接,防止連接還沒斷開就關(guān)閉窗口,server端會(huì)拋異常。

    window.onbeforeunload = function () {

        closeWebSocket();

    }


    //關(guān)閉WebSocket連接

    function closeWebSocket() {

        websocket.close();

    }


    //將消息顯示在網(wǎng)頁上

    function setMessageInnerHTML(innerHTML) {

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

    }
</script>
<body>

</body>
</html>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,644評論 1 32
  • 當(dāng)?shù)谝淮慰吹竭@個(gè)題目的時(shí)候,都感覺自己沒有成就事件。看了別人的文章后,覺得他們真的非常棒。但是每個(gè)人的人生不...
    十三等于一閱讀 972評論 2 0
  • 教材:快學(xué)Scala chapter 14. 模式匹配和樣例類 Pattern Matching and Case...
    hakase_nano閱讀 259評論 0 0
  • 幾乎每年的清明時(shí)節(jié)都是雨紛紛,可今年卻是艷陽高照,春和景明。 照舊我們一家三口到婆家祭拜了先人——我特...
    薔薇女士閱讀 211評論 0 0
  • 來來回回,刪來刪去的那些些焦慮。徘徊著不好的情緒。那年夏天以為是幸福的開始,考慮了白發(fā)蒼蒼朝朝暮暮。我知道那是一條...
    金不換jbh閱讀 233評論 0 0

友情鏈接更多精彩內(nèi)容