spring4使用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
小站,水管比較細,速度稍慢,嘿。