Tutorial berikut adalah sistem CRM dari perusahaan yang saya ikuti dalam pengembangan perusahaan, dan memilah beberapa informasi yang relevan. Ada banyak fungsi dorongan pesan dalam sistem, dan teknologi WebSocket digunakan di dalamnya. Editor berikut menyusun dan membagikannya di platform Wulin Network untuk referensi Anda
1. Ketergantungan Maven
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.3. 0 </version> </dependency> <dependency> <groupid> com.fasterxml.jackson.core </groupid> <ArTifactId> Jackson-core </artifactid> <version> 2.3.0 </version> </dependency> <dependency> <groupid> com.fasterxml.jackson.core </groupid> <sgroupid> JACKON -databind </artifactId> <version> 2.3.0 </version> </dependency> <dependency> <GroupId> org.springframework </groupid> <ArTifactId> Spring-Websocket </artifactid> <version> 4.0.1. Rilis </version> </dependency> <dependency> <GroupId> org.springframework </groupid> <ArTifactId> Pegas </ArTifactId> <version> 4.0.1.release </versi> </dependency>
2. Konfigurasi Lemasan Pegas
<? Xml Version = "1.0" encoding = "UTF-8"?> <Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: context = "http://www.springframework.org/schema/cont ext "xmlns: mvc =" http://www.springframework.org/schema/mvc "xmlns: tx =" http://www.springframework.org/schema " xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: WebSocket = "http://www.springframework.org/schema/websocket" xsi: schemalocation = "httpe/schema .springframework.org/schema/beanshttp: //www.springframework.org/schema/beans/spring-beans-3.1.xsdhttp: //www.springframework.org/schema/context/spring -context-3.1.xsdhttp: //www.springframework.org/schema/mvchttp: //www.springframework.o RG/SCHEMA/MVC/SPRING-MVC-3.1.XSDHTTP: //www.springframework.org/schema/txhttp: //www.spr ingframework.org/schema/tx/spring-tx-3.1.xsdhttp://www.springframework.org/schema/websocketththttp://www.springframework.org/schema/websocket/spring-websock.pramewework.org. ... ID = "WebSocket"/> <WebSocket: Handlers> <Websocket: Mapping Path = "/WebSocket" Handler = "WebSocket"/> <Websocket: Handshake-Interceptors> <bean/> <Websocket: Handshake-Interceptors> </Websocket: Handlers> </bean>
Di antara mereka, jalur yang sesuai dengan jalur adalah jalur antarmuka yang disetel melalui protokol WS di bagian sebelumnya.
3. Implementasi HandshakeInterceptor
Paket cn.bridgeli.websocket; impor cn.bridgeli.utils.usermanager; import cn.bridgeli.util.dateutil; impor cn.bridgeli.sharesession.userinfo; impor org.apache.commons.lang.stringutils; impor org.apache.commons.lang.stringutils; org.apache.apache.commons.lang.stringutils; org.slf4j.loggerFactory; impor org.springframework.http.server.serverHttpRequest; impor org.springframework.http.server.serverhtpresponse; org.springframework.weB.context org.springframework.web.context.request.servletrequestattributes; impor org.springframework.web.socket.websockethandler; impor org.springframework.web.socket.server.support.httpressiessessionSessessessesscory; java.util.Map;/*** @Description :Create a handshake interface* @Date: 16-3-3*/public class HandshakeInterceptor extends HttpSessionHandshakeInterceptor{private static final Logger logger = LoggerFactory.getLogger(HandshakeInterceptor.class);@Overridepublic boolean beforeHandshake(ServerHttpRequest Permintaan, ServerHttPresponse Response, WebSockethandler Wshandler, peta <String, objek> atribut) melempar pengecualian {logger.info ("Sebelum membuat jabat tangan ..."); servletRequestAttributes attrs = (servletRequuteRoSeReSeRyEngeReDerer.getRibutes = (servletRequute ()ErusEngo () Userinfo () () ()ErUseRyReRererer UserManager.getSessionUser (attrs.getRequest ()); userocketvo userocketvo = Usersocketvo baru (); string email = ""; if (null! = Suruser) {email = surruser.geteMail ();} if (stringutils.isblank (email)) {email = dateutil ();} if (stringutils.isblank (email)) {email = dateutil ();} if (stringutils.isBlank (email)) {email = dateutil (); Date ());} userocketvo.setuseremail (email); attributes.put ("session_user", userocketvo); kembalikan super.beforeHandshake (permintaan, respons, wshandler, atribut);}@overridepublic void afterhandshake (serverHttprequest, serverHttpresponse response, websockethandler wshandler, pengecualian ex) {logger.info ("Setelah membuat buatan tangan ...");Karena saya tidak mengerti dengan baik, saya menyimpan kode asli sejauh maksimum. Ini sebenarnya untuk mengeluarkan pengguna login saat ini dari masuk tunggal, mengubahnya menjadi objek UsersocketVo, dan memasukkannya ke dalam peta. Jadi mari kita lihat definisi objek UsersocketVo
4. Definisi UsersocketVo
Paket cn.bridgeli.websocket; impor org.springframework.web.socket.websocketsession; import java.util.date;/*** @description: Entitas koneksi soket pengguna*@Date: 16-3-7*/Public ClassCocketVo {private string useremail; // Pengguna Email Private Date ConnectionTime; // Waktu Koneksi yang Sukses Prasyarat Prasyarat; // Waktu Permintaan Terakhir Tanggal pribadi newRequesttime; // Permintaan Baru Waktu Tanggal Pribadi LastSendtime = Tanggal baru (); // Waktu pengiriman terakhir dari pesan penghapusan tanggal pribadi lastTaskEndtime = new date (); // waktu pengiriman terakhir dari tugas Websocketsession Websocketsession Pribadi yang tertunda; // WSSESSION yang sesuai dengan Pengguna hanya cache satu secara default // getxx dan setxx}Yang paling penting adalah properti WebSocketsession, yang akan kami gunakan nanti
5. Implementasi WebSocketendPoint
Paket cn.bridgeli.websocket; impor org.slf4j.logger; impor org.slf4j.loggerfactory; impor org.springframework.beans.factory.annotation.Autowired; impor org.springframework.web.socket.socket.closestate; org.springframework.web.socket.textmessage; impor org.springframework.web.socket.websocketsession; impor org.springframework.web.socket.handler.textwebsockethandler;/*** @description: Websocket Class @dextwebsockethandler;/*** @description: Websocket class @dexcockethandler;/*** TextWebSockethandler {private static final Logger Logger = loggerFactory.getLogger (WebSocketendPoint.class);@AutoWiredPrivate NewsListenerImpl NewsListener; @Overrideprotected void handleTextMessage (Sesi WebSocketsession, pesan teks) memerankan Exception {mailsExsession (MESESSESSESSIESSEXSESSIGE (MESSESSAGE) LOVERSEPSION {MESSESSEXESSESSESSIESSEXSESSION, MESSESSIESSEGE) LOVERSEPSION {MESSESSEXESSESSIESSEXESSIESSIESSIESSIESSEPSESSIFE) TextMessage(message.getPayload()+" received at server");session.sendMessage(returnMessage);}/*** @Description : After establishing the connection* @param session* @throws Exception*/@Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception{UserSocketVo userSocketVo = (Userocketvo) session.getAttributes (). Get ("session_user"); if (null! = Usersocketvo) {userocketvo.setwebsocketsession (sesi); if (wssessieslocalcache.exists (userocketvo.getUseremail ())) {wssessionlocalcache.remove (userocketvo.getUseremail ());} wssessionlocalcache.put (usersocketvo.getuseremail (), userSocketVo);newsListener.afterConnectionEstablished(userSocketVo.getUserEmail());}logger.info("socket successfully established connection...");super.afterConnectionEstablished(session);}@Overridepublic void afterConnectionClosed(WebSocketSession session,CloseStatus status) throws Exception{UserSocketVo userSocketVo = (Userocketvo) session.getAttributes (). Get ("session_user"); if (null! = Usersocketvo) {wssessionlocalcache.remove (userocketvo.getUseremail ());} logger.info ("socket berhasil menutup koneksi ...");6. Implementasi WSSessionLocalcache
Paket cn.bridgeli.websocket; impor java.io.serializable; impor java.util.arraylist; impor java.util.hashmap; impor java.util.list; impor java.util.map;/*** @description: WebSocketsession WaveSession*@descaues*@description: Contoh Webel Cache Lokal*@deRoces: 16-NaPap; Serializable {Private Static Map <String, UsersocketVo> wsSessionCache = hashMap baru <> (); boolean statis publik ada (string useremail) {if (! Wssessioncache.containskey (useremail)) {return false;} else {return true;}} public static void public void; Usersocketvo) {wssessioncache.put (useremail, userocketvo);} public static userocketvo get (string useremail) {return wssessioncache.get (useremail);} public static rampai (string useremail) {wssessioncache.remove (useremail); Arraylist <> (wssessioncache.values ());}}Setelah melihat implementasinya, efeknya lebih jelas. Ini menyimpan data terbaru dari masing -masing UsersocketVo. Faktanya, implementasi Websocket kami telah dihitung di sini, tetapi masih ada kelas inti (kelas Charlie tentang logika bisnis) yang belum diimplementasikan. Pada artikel berikutnya, Contoh Aplikasi Websocket yang terintegrasi Spring (Bagian 2), kita akan melihat cara mengimplementasikan kelas ini.
Pengantar Protokol Websocket
Protokol Websocket adalah fungsi penting di bidang web yang ditentukan oleh spesifikasi RFC-6455: dupleks penuh, yaitu komunikasi dua arah antara klien dan server. Ini adalah fitur yang menarik. Industri ini telah mengeksplorasi bidang ini sejak lama. Teknologi yang digunakan termasuk Java Applet, XMLHTTPREQUEST, Adobe Flash, ActiveXObject, berbagai teknologi komet, acara pengiriman sisi server, dll.
Harus dipahami bahwa sebelum menggunakan protokol WebSocket, Anda perlu menggunakan protokol HTTP untuk membangun jabat tangan awal. Ini bergantung pada suatu mekanisme - membangun HTTP dan meminta peningkatan protokol (atau konversi protokol). Ketika server setuju, itu akan menanggapi kode status HTTP 101, menunjukkan bahwa mereka setuju untuk mengganti protokol. Dengan asumsi bahwa jabat tangan yang berhasil melalui soket TCP dan permintaan peningkatan protokol HTTP dilewati, maka klien dan server dapat saling mengirim pesan.
Spring Framework 4.0 dan di atas memperkenalkan modul baru, yaitu modul Spring-Websocket. Ini memberikan dukungan untuk komunikasi WebSocket. Ini kompatibel dengan spesifikasi API Java Websocket JSR-356, sambil memberikan fungsionalitas tambahan.
Dalam skenario apa Anda harus menggunakan WebSocket
Dalam aplikasi web, ketika klien dan server perlu bertukar acara dengan frekuensi yang lebih tinggi dan latensi yang lebih rendah, itu cocok untuk WebSocket. Oleh karena itu, Websocket cocok untuk skenario aplikasi seperti keuangan, permainan, dan kolaborasi.
Mungkin tidak cocok untuk skenario aplikasi lainnya. Misalnya, langganan berita membutuhkan berita utama untuk ditampilkan, dan juga boleh menggunakan pemungutan suara yang panjang dari beberapa menit, dan penundaan di sini dapat diterima.
Bahkan dalam aplikasi di mana latensi rendah diperlukan, jika jumlah pesan yang dikirimkan sangat rendah (seperti kegagalan jaringan pemantauan), teknologi pemungutan suara yang panjang harus dipertimbangkan.
Hanya dalam skenario dengan latensi rendah dan komunikasi pesan frekuensi tinggi, memilih protokol WebSocket sangat cocok. Bahkan dalam skenario aplikasi seperti itu, apakah masih mungkin untuk memilih komunikasi WebSocket? Atau pilih REST HTTP Communication?
Jawabannya adalah bahwa itu akan tergantung pada kebutuhan aplikasi. Namun, juga dimungkinkan untuk menggunakan kedua teknologi ini secara bersamaan untuk menempatkan data yang perlu sering dipertukarkan ke Websocket, dan menggunakan API REST sebagai teknologi implementasi bisnis berbasis proses. Selain itu, ketika informasi tertentu perlu disiarkan ke beberapa klien dalam panggilan API REST, itu juga dapat diimplementasikan melalui koneksi WebSocket.
Kerangka kerja Spring menyediakan anotasi @Controller dan anotasi @RestController, yang keduanya dapat digunakan untuk pemrosesan permintaan HTTP dan pemrosesan pesan WebSocket. Selain itu, metode pemrosesan permintaan MVC Spring, atau metode pemrosesan permintaan aplikasi lainnya, dapat dengan mudah menggunakan protokol WebSocket untuk menyiarkan pesan ke semua klien yang tertarik atau pengguna yang ditunjuk.