springMVC使用websocket實如今線客服

1.環境

springMVC+spring+mybatis(spring4.0以上)javascript

注意須要導入spring-websocketwebsocket-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>

2.後臺代碼

        用Map存放當前登陸的帳戶及其對應的sessionjava

提出幾點解釋:web

  1. @ServerEndpoint:把當前類變成websocket服務類
  2. @OnOpen: 鏈接時執行
  3. @OnClose:關閉時執行
  4. @OnMessage:收到消息時執行
  5. @OnError:鏈接錯誤時執行
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;
				}
			}
		}
}

3.html

1、操做類html

<!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>

2、接收類1

<!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>

3、接收類2

<!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

相關文章
相關標籤/搜索