spring4使用websocket

ygfb 9年前發布 | 43K 次閱讀 WebSocket 開發 WebSocket

       看到spring4的介紹上說已經支持websocket了,嘗試了一下之后各種坑,不如servlet簡單,寫篇文章來講解一下自己遇到的坑。

       環境:tomcat8+spring4.1.6+jdk8+nginx1.8.0

       先是看了下網絡上的人的實現,千奇百怪,干脆直接在spring的官方文檔上觀望了一下,看了下他們官方的實現,然而我用的是springmvc,總是失敗,報的錯誤翻譯過來大致是找不到請求,所有的頁面請求都找不到,找到原因是WebSocketConfig在繼承AbstractWebSocketMessageBrokerConfigurer的時候注解上需要加上對springMVC的支持,即@EnableWebMvc,和你在spring配置文件里配置包掃描一個用處。廢話不多說,先上代碼。

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.socket.config.annotation.*;
 
@Configuration
@EnableWebMvc
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
 
    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/tweet");
        config.setApplicationDestinationPrefixes("/websocket");
    }
 
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/hello").withSockJS();
    }
 
}



      以上是websocket配置類,下面是請求。

import com.yuorfei.bean.ResultData;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;
 
@Controller("chat")
public class ChatAction {
 
    private static final Log log = LogFactory.getLog(MessageAction.class);
 
    @MessageMapping("/hello")
    @SendTo("/tweet/fuck")
    public ResultData chat(String message) throws Exception {
        long time = System.currentTimeMillis();
        log.info(time+":"+message);
        return new ResultData(time,true,message);
    }
 
}


      請求類準備好了之后寫前端代碼:

      前端代碼需要引入的js有sockjs-1.0.3.min.js,stomp.min.js兩個,去官網下最新的就行,我目前用的是最新的。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <script src="/dest/js/fun/chat/sockjs-1.0.3.min.js"></script>
    <script src="/dest/js/fun/chat/stomp.min.js"></script>
    <!-- 為了方便起見,js我就直接這么放這兒了 -->
    <script>
        var stompClient = null;
            
        function setConnected(connected) {
            document.getElementById('connect').disabled = connected;
            document.getElementById('disconnect').disabled = !connected;
            document.getElementById('conversationDiv').style.visibility = 
                connected ? 'visible' : 'hidden';
            document.getElementById('response').innerHTML = '';
        }
            
        function connect() {
            var socket = new SockJS('/hello');
            stompClient = Stomp.over(socket);
            stompClient.connect({}, function(frame) {
                setConnected(true);
                console.log('Connected: ' + frame);
                stompClient.subscribe('/tweet/fuck', function(greeting){
                    showGreeting(JSON.parse(greeting.body).code+" : "+
                        JSON.parse(greeting.body).message);
                });
            });
        }
            
        function disconnect() {
            if (stompClient != null) {
                stompClient.disconnect();
            }
            setConnected(false);
            console.log("Disconnected");
        }
            
        function sendMessage() {
            var message = document.getElementById('message').value;
            stompClient.send("/websocket/hello", {}, JSON.stringify({ 'message': message }));
        }
    
        function showGreeting(message) {
            var response = document.getElementById('response');
            var p = document.createElement('p');
            p.style.wordWrap = 'break-word';
            p.appendChild(document.createTextNode(message));
            response.appendChild(p);
        }
    </script>
</head>
<body onload="disconnect()">
    <noscript>
        <h2 style="color: #ff0000">不支持的瀏覽器版本,丫的是不是用IE了,你這簡直是摧殘程序員的生命</h2>
    </noscript>
    
    <a href="${homeUrl!"/"}"><h5>返回與或非網站首頁</h5></a>
    <hr/>
    
    <p>這只是一個SpringMVC的websocket例子</p>
    
    <div>
        <div>
            <button id="connect" onclick="connect();">連接</button>
            <button id="disconnect" disabled="disabled" onclick="disconnect();">
            斷開連接</button>
        </div>
        <div id="conversationDiv">
            <label>你要說什么</label><input type="text" id="message" />
            <button id="sendMessage" onclick="sendMessage();">發送</button>
            <p id="response"></p>
        </div>
    </div>
    <hr/>
</body>
</html>



       到了這里就ok了,但是運行卻發現會報錯,錯誤信息翻譯過來大致意思是:沒有引入jackson2的包 或者 socket消息轉換沒有配置。

       猛然一想我的確沒有引入jackson2,趕緊maven把jackson2的依賴加進來,很久以前用過jackson,然而不知道2里頭只引入core的jar包是不行的,還需要

jackson-databind和jackson-annotations,為了方便我索性全加入進來了(真是夠大的,不如fastjson清爽)。


       這樣就ok了,配置好了之后發送消息,正常接收,處理,ok,控制臺不報煩人的錯了。

       已經部署在線上了, 地址:websocket  

       小站,水管比較細,速度稍慢,嘿。


 本文由用戶 ygfb 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!