Ada tiga langkah utama dalam artikel ini
1. Setelah pengguna masuk, buat koneksi WebSocket. Pilihan default dipilih. Jika browser tidak mendukungnya, gunakan Sockjs untuk mensimulasikan koneksi.
2. Setelah membuat koneksi, server mengembalikan pesan pengguna yang belum dibaca.
3. Setelah server melakukan operasi terkait, dorong pesan baru ke pengguna tertentu atau semua pengguna. Spring 4.0.6 (Pilih 4.0+), Tomcat7.0.55
Implementasi Server Websocet
Websocketconfig.java
@Configuration@enableWebMvc@enableWebsocketpublic kelas WebSocketConfig memperluas WebMvCconfigurerAdapter mengimplementasikan WebSocketConfigurer {@Overridepublic void RegisterWebSockethandlers (WebSockethandlegistry Registry) {registry.addhandler (SystemsockethAndEnder () {Registry.addhandler (WebSockEnchigher (") {Registry.addhandler (WebSockethAnderDer (") {registry.addhandler. WebSocketHandshakeInterceptor());registry.addHandler(systemWebSocketHandler(), "/sockjs/webSocketServer").addInterceptors(new WebSocketHandshakeInterceptor()).withSockJS();}@Beanpublic WebSocketHandler systemWebSocketHandler(){return new SystemWebSocketHandler();}}Jangan lupa untuk mengkonfigurasi pemindaian otomatis kelas ini di file konfigurasi SpringMVC
<konteks: komponen-scan-package = "com.ldl.origami.websocket" />
@Konfigurasi
@EnableWebMvc
@EnableWebsocket
Ketiga ini secara kasar berarti bahwa kelas ini mendukung pemuatan kacang dalam mode @Bean, dan mendukung SpringMVC dan WebSocket. Itu tidak terlalu akurat. Saya mencoba @EnableWebMvc tanpa menambahkannya, dan @configuration awalnya mendukung pemindaian otomatis springmvc
Registry.addhandler (SystemWebSockethandler (), "/WebSocketserver"). AddInterceptors (WebSockethandShakeInterceptor () baru ())
Digunakan untuk mendaftarkan kelas implementasi server WebSocket. Parameter kedua adalah mengakses alamat WebSocket.
Registry.addhandler (SystemWebSockethandler (), "/sockjs/websocketserver").addInterceptors( WebSockethandshakeInterceptor ()). withsockjs ();}
Ini adalah metode pendaftaran menggunakan sockjs
SystemWebsockethandler.java
public class SystemWebSocketHandler implements WebSocketHandler {private static final Logger logger;private static final ArrayList<WebSocketSession> users;static {users = new ArrayList<>();logger = LoggerFactory.getLogger(SystemWebSocketHandler.class);}@Autowiredprivate WebSocketService webSocketService;@Overridepublic void AfterConnectionestablished (Sesi WebSocketsession) melempar Exception {Logger.Debug ("Sambungkan ke Websocket Success ..."); Users.add (sesi); string username = (string) session.getAttributes (). get (constants.websocket_username); if (if Username! websocketservice.getunreadnews ((string) session.getAttributes (). get (constants.websocket_username)); session.sendMessage (TextMessage baru (Count + ""));}}@overridepublic void handlemessage (WebSocketession Sesi, WebSockMessMessage <cksockmessage <cuxtage> EXCKEION <? {// sendMessageTousers ();}@overridepublic void handletransporterror (sesi WebSocketsession, pengecualian yang dapat dilempar) melempar pengecualian {if (session.isopen ()) {session.close ();} Logger.debug ("WebSocket Connection ditutup ......"); Users.remor.remove); afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {logger.debug("websocket connection closed...");users.remove(session);}@Overridepublic boolean supportsPartialMessages() {return false;}/*** Send message to all online users** @param message*/public void sendMessageToUsers(TextMessage message) {for (websocketsession user: user) {try {if (user.isopen ()) {user.sendMessage (pesan);}} catch (ioException e) {e.printstacktrace ();}}/** Pesan void ke pengguna ** @param username*@param pesan*/publicm) {for (WebSocketsession User: Users) {if (user.getAttributes (). get (constants.websocket_username) .equals (userName)) {coba {if (user.isopen () {User.sendMessage (pesan);}} catch (ioException e) {e.sendSceptst (pesan);Anda dapat memahami konten yang relevan secara sekilas, jadi saya tidak akan banyak menjelaskannya
Kemudian WebsockethandshakeInterceptor.java
public class WebSocketHandshakeInterceptor implements HandshakeInterceptor {private static Logger logger = LoggerFactory.getLogger(HandshakeInterceptor.class);@Overridepublic boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {if (request instanceof ServletServerHttpRequest) {servletServerHttpRequest servletRequest = (servletServerHttprequest) permintaan; httpsession sesi = singeFeTeal) {getServerRequest (). GetSession (false); if (sesi! = Null) {// menggunakan nama username (). GetSession (false); if order! = Null) {// gunakan username ke websesie). session.getAttribute (constants.session_username); atribut.put (constants.websocket_username, username);}} return true;}@overridepublic void afterhandshake (serverHttpRequest request, serverhttpresponse response, WebSockethandler wshandler, pengecualian pengecualian) {}}Fungsi utama dari ini adalah untuk mendapatkan nama pengguna dalam permintaan saat ini dan menyimpannya ke Websockethandler saat ini untuk menentukan pengguna yang sesuai ke WebSockethandler. Untuk detailnya, silakan merujuk ke httpsessionHandshakeInterceptor
Login Pengguna Untuk Membangun Koneksi Websocket
index.jsp
<script type="text/javascript" src="http://localhost:8080/Origami/websocket/sockjs-0.3.min.js"></script><script>var websocket;if ('WebSocket' in window) {websocket = new WebSocket("ws://localhost:8080/Origami/webSocketServer");} else if ('Mozwebsocket' di jendela) {websocket = mozwebsocket baru ("ws: // localhost: 8080/origami/websocketserver");} else {websocket = sockjs baru ("http: // localhost: 8080/origami/sockjs/WebSocketserver"; {};websocket.onmessage = function (evnt) {$("#msgcount").html("(<font color='red'>"+evnt.data+"</font>)")};websocket.onerror = function (evnt) {};websocket.onclose = function (evnt) {}</script>Hati -hati saat menggunakan sockjs
1. Cara menulis keduanya
<type skrip = "teks/javascript" src = "http: // localhost: 8080/origami/websocket/sockjs-0.3.min.js"> </script> websocket = sockjs baru (http: // localhost: 8080/origami/sockjs/websocketserver);
2. Dalam Web.xml
<Web-App Version = "3.0" xmlns = "http://java.sun.com/xml/ns/javaee" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalocation = "http:/java http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd ">
Versi
WEB-APP_3_1.XSD
Kedua versi harus 3.0+
Kemudian tambahkan di servlet ini
<Sinync-Supported> true </async-supported> <servlet> <servlet-name> appSerVlet </servlet-name> <servlet-class> org.springframework.web.servlet.dispatcherServlet </servlet-class> <init-param> <param-name > ContextConfigLocation </param-name> <Param-Value> classPath*: servlet-context.xml </param-value> </it-param> <Load-N-startup> 1 </load-on-startup> <Sync-supported> true </async-supported> </servlet>
Maka semua filter ditambahkan
<SuSync-didukung> Benar </Supported>
3. Tambahkan dependensi terkait
<dependency> <GroupId> com.fasterxml.jackson.core </groupid> <ArTifactId> Jackson-annotations </RaintifactId> <Version> 2.3.0 </version> </dependency> <Arpeptency> <Groupid> com.fasterxml.jackson.core </groupid> <Arttifa CTID> Jackson-core </RiTtifacTID> <Version> 2.3.1 </version> </dependency> <dependency> <groupid> com.fasterxml.jackson.core </groupid> <ArtiFacTID> Jackson-Databind </Artifactid> <version> 2.3.3 </version> </Dependency>
Oke, sekarang Websocket dapat ditetapkan secara normal
Mengembalikan pesan pengguna yang belum dibaca
Setelah koneksi dibuat, metode afterconnection yang dibantahkan dari SystemWebSockethandler akan dimasukkan. Lihatlah kode di atas dan keluarkan nama pengguna yang disimpan di WebSockethandshakeInterceptor
Setelah meminta informasi, gunakan session.sendMessage (TextMessage baru (Count + "")); untuk mengembalikannya ke pengguna, dan kembali dan pergi.
Dorong pesan ke pengguna di server
@ControllerPublic Class AdmIncontroller {static Logger Logger = LoggerFactory.getLogger (admincontroller.class);@autowired (wajib = false) admin adminservice private adminservice; @BeanPublic SystemWebSockethandler SystemWebSockethandler () {return baru SystemWebSockethandler ();}@requestMapping ("/auditing")@responseBodypublic string auditing (permintaan httpservletrequest) {// int unreadnewscount = admInservice.getunreadnews (Username); SystemWebsockethandler (). SendMessagetous (Username); SystemSockethandler (). SendMessagetous (Username); SystemSockethandler (). SendMessagetous (UserName); SystemSockethandler (). SendMessagetouser (UserName); hasil;}}Di sini Anda dapat menggunakan SendMessageTouser untuk mendorong informasi kepada pengguna, atau Anda dapat menggunakan SendMessageTousers untuk mendorong informasi ke semua pengguna.