springMVC+spring+mybatis(spring4.0以上)javascript
注意須要導入spring-websocket和websocket-api包。其他架包正常ssm便可,可自行百度html
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-websocket</artifactId> <version>4.0.5.RELEASE</version> </dependency> <dependency> <groupId>javax.websocket</groupId> <artifactId>javax.websocket-api</artifactId> <version>1.1</version> <scope>provided</scope> </dependency>
用Map存放當前登陸的帳戶及其對應的sessionjava
提出幾點解釋:web
import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Set; import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @Description: 簡單websocket demo * */ @ServerEndpoint(value = "/websocketTest/{userId}")//@ServerEndpoint把當前類變成websocket服務類 public class WebsocketTest { private Logger logger = LoggerFactory.getLogger(WebsocketTest.class); private static String userId; // 鏈接的用戶 private static Map<String, Session> onlines = new HashMap<String, Session>(); // 鏈接時執行 @OnOpen public void onOpen(@PathParam("userId") String userId, Session session) throws IOException { this.userId = userId; onlines.put(userId, session); System.out.println("新鏈接:" + userId); } // 關閉時執行 @OnClose public void onClose(@PathParam("userId") String userId) { if (onlines.containsKey(userId)) { onlines.remove(userId); } System.out.println("鏈接close:" + this.userId + " 關閉"); } // 收到消息時執行 @OnMessage public void onMessage(String message, Session session, @PathParam("userId") String userId) throws IOException { System.out.println(message); if (message.contains("&")) { String[] params = message.split("&"); if (params[1].equals("all")) { System.out.println("廣播"); sendMessageToAll(userId + "發送廣播消息:" + params[0]); } else { System.out.println("toUser"); sendMessageToUser(userId, params[1], params[0]); ; } }else session.getBasicRemote().sendText(userId+"發送消息: " + message); System.out.println(onlines.toString()); } // 鏈接錯誤時執行 @OnError public void onError(Session session, Throwable error) { System.out.println("用戶id爲:" + this.userId + "的鏈接發送錯誤"); error.printStackTrace(); } /** * 廣播消息給全部人 * **/ private void sendMessageToAll(String message) { Set<String> users = onlines.keySet(); for (String user : users) { try { if (onlines.get(user).isOpen()) { ((Session) onlines.get(user)).getBasicRemote().sendText(message); } } catch (IOException e) { e.printStackTrace(); break; } } } /****** * 給某個用戶發送消息 * @Param userName 發消息的name * **/ private void sendMessageToUser(String userName, String receiveName, String message) { Set<String> users = onlines.keySet(); for (String user : users) { if (user.equals(receiveName)) { try { if (onlines.get(user).isOpen()) { System.out.println("user---" + user); ((Session) onlines.get(user)).getBasicRemote().sendText(userName + "給你發了消息:" + message); } } catch (IOException e) { e.printStackTrace(); } break; } } } }
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> 廣播消息---- admin <br /> <input id="text" type="text" /> <button onclick="send()">Send</button> <select id="toUser" > <option id="toUser" value="all">ALL</option> <option id="toUser" value="user001">user001</option> <option id="toUser" value="user002">user002</option> </select> <button onclick="closeWebSocket()">Close</button> <div id="message"></div> <script type="text/javascript"> //判斷當前瀏覽器是否支持WebSocket if ('WebSocket' in window) { websocket = new WebSocket( "ws://localhost:8088/IM/websocketTest/admin"); console.log("link success") } else { alert('Not support websocket') } //鏈接發生錯誤的回調方法 websocket.onerror = function() { setMessageInnerHTML("error"); }; //鏈接成功創建的回調方法 websocket.onopen = function(event) { setMessageInnerHTML("open"); } console.log("-----") //接收到消息的回調方法 websocket.onmessage = function(event) { setMessageInnerHTML(event.data); } //鏈接關閉的回調方法 websocket.onclose = function() { setMessageInnerHTML("close"); } //監聽窗口關閉事件,當窗口關閉時,主動去關閉websocket鏈接,防止鏈接還沒斷開就關閉窗口,server端會拋異常。 window.onbeforeunload = function() { websocket.close(); } //將消息顯示在網頁上 function setMessageInnerHTML(innerHTML) { document.getElementById('message').innerHTML += innerHTML + '<br/>'; } //關閉鏈接 function closeWebSocket() { websocket.close(); } //發送消息 function send() { var message = document.getElementById('text').value; var user = document.getElementById('toUser').value; message+='&'+user; websocket.send(message); } </script> </body> </html>
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> websocket Demo---- user001 <br /> <input id="text" type="text" /> <button onclick="send()">Send</button> <button onclick="closeWebSocket()">Close</button> <div id="message"></div> <script type="text/javascript"> //判斷當前瀏覽器是否支持WebSocket if ('WebSocket' in window) { websocket = new WebSocket( "ws://localhost:8088/IM/websocketTest/user001"); console.log("link success") } else { alert('Not support websocket') } //鏈接發生錯誤的回調方法 websocket.onerror = function() { setMessageInnerHTML("error"); }; //鏈接成功創建的回調方法 websocket.onopen = function(event) { setMessageInnerHTML("open"); } console.log("-----") //接收到消息的回調方法 websocket.onmessage = function(event) { setMessageInnerHTML(event.data); } //鏈接關閉的回調方法 websocket.onclose = function() { setMessageInnerHTML("close"); } //監聽窗口關閉事件,當窗口關閉時,主動去關閉websocket鏈接,防止鏈接還沒斷開就關閉窗口,server端會拋異常。 window.onbeforeunload = function() { websocket.close(); } //將消息顯示在網頁上 function setMessageInnerHTML(innerHTML) { document.getElementById('message').innerHTML += innerHTML + '<br/>'; } //關閉鏈接 function closeWebSocket() { websocket.close(); } //發送消息 function send() { var message = document.getElementById('text').value; websocket.send(message); } </script> </body> </html>
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> websocket Demo---- user002 <br /> <input id="text" type="text" /> <button onclick="send()">Send</button> <button onclick="closeWebSocket()">Close</button> <div id="message"></div> <script type="text/javascript"> //判斷當前瀏覽器是否支持WebSocket if ('WebSocket' in window) { websocket = new WebSocket( "ws://localhost:8088/IM/websocketTest/user002"); console.log("link success") } else { alert('Not support websocket') } //鏈接發生錯誤的回調方法 websocket.onerror = function() { setMessageInnerHTML("error"); }; //鏈接成功創建的回調方法 websocket.onopen = function(event) { setMessageInnerHTML("open"); } console.log("-----") //接收到消息的回調方法 websocket.onmessage = function(event) { setMessageInnerHTML(event.data); } //鏈接關閉的回調方法 websocket.onclose = function() { setMessageInnerHTML("close"); } //監聽窗口關閉事件,當窗口關閉時,主動去關閉websocket鏈接,防止鏈接還沒斷開就關閉窗口,server端會拋異常。 window.onbeforeunload = function() { websocket.close(); } //將消息顯示在網頁上 function setMessageInnerHTML(innerHTML) { document.getElementById('message').innerHTML += innerHTML + '<br/>'; } //關閉鏈接 function closeWebSocket() { websocket.close(); } //發送消息 function send() { var message = document.getElementById('text').value; websocket.send(message); } </script> </body> </html>
4.具體效果spring
截圖以下,實現簡單web聊天功能。api