打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
爱威尔

关于原理我就不啰嗦了。自己在网上搜一下就知道了。

1.注册服务:

package com.tw.webSocket;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;import org.springframework.web.socket.WebSocketHandler;import org.springframework.web.socket.config.annotation.EnableWebSocket;import org.springframework.web.socket.config.annotation.WebSocketConfigurer;import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;@Configuration@EnableWebSocketpublic class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer{	@Override	public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {		registry.addHandler(systemWebSocketHandler(), "/webSocketServer").addInterceptors(new MyHandshakeInterceptor());		System.out.println("registed!");		registry.addHandler(systemWebSocketHandler(), "/sockjs/webSocketServer").addInterceptors(new MyHandshakeInterceptor()).withSockJS();			}	@Bean	public WebSocketHandler systemWebSocketHandler(){		return new SystemWebSocketHandler();	}}
我们注册两种:ws 和http 实现websocket。

2.继承握手拦截器:

package com.tw.webSocket;import java.util.Map;import javax.servlet.http.HttpSession;import org.springframework.http.server.ServerHttpRequest;import org.springframework.http.server.ServerHttpResponse;import org.springframework.http.server.ServletServerHttpRequest;import org.springframework.stereotype.Component;import org.springframework.web.socket.WebSocketHandler;import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;import com.tw.entity.sys.User;@Componentpublic class MyHandshakeInterceptor extends HttpSessionHandshakeInterceptor{	@Override	public boolean beforeHandshake(ServerHttpRequest request,			ServerHttpResponse response, WebSocketHandler handler,			Map<String, Object> map) throws Exception {		if (request instanceof ServletServerHttpRequest) {			ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;			HttpSession session = servletRequest.getServletRequest().getSession(false);			if (session!=null) {				System.out.println("ok");				User u = (User) session.getAttribute("U");				map.put("username", u.getName());			}		}		return true;	}		@Override	public void afterHandshake(ServerHttpRequest request,			ServerHttpResponse response, WebSocketHandler wsHandler,			Exception ex) {	}}
这里是拿到在线的用户。

3.实现服务端的消息接受和推送:

package com.tw.webSocket;import java.io.IOException;import java.util.ArrayList;import org.springframework.stereotype.Component;import org.springframework.web.socket.CloseStatus;import org.springframework.web.socket.TextMessage;import org.springframework.web.socket.WebSocketHandler;import org.springframework.web.socket.WebSocketMessage;import org.springframework.web.socket.WebSocketSession;@Componentpublic class SystemWebSocketHandler implements WebSocketHandler{	private static final ArrayList<WebSocketSession> users;	static{		users = new ArrayList<WebSocketSession>();	}		public SystemWebSocketHandler(){			}	@Override	public void afterConnectionClosed(WebSocketSession session, CloseStatus status)			throws Exception {		users.remove(session);	}	@Override	public void afterConnectionEstablished(WebSocketSession session)			throws Exception {		System.out.println("Server:cennected OK!");		users.add(session);	}	@Override	public void handleMessage(WebSocketSession session, WebSocketMessage<?> message)			throws Exception {		TextMessage tm = new TextMessage(message.getPayload()+"");		System.out.println(message.getPayload());		session.sendMessage(tm);	}	@Override	public void handleTransportError(WebSocketSession session, Throwable throwable)			throws Exception {		if (session.isOpen()) {			session.close();		}		users.remove(session);	}	@Override	public boolean supportsPartialMessages() {		return false;	}	/**	 * 给所有在线用户发送消息	 * @param message	 */	public void sendMessageToUsers(TextMessage message) {		for (WebSocketSession user : users) {			if (user.isOpen()) {				try {					user.sendMessage(message);				} catch (IOException e) {					e.printStackTrace();				}			}		}	}		public void sendMessageToUser(String username,TextMessage message) {		for (WebSocketSession user : users) {			if (user.getAttributes().get("username").equals(username)) {				try {					if (user.isOpen()) {						user.sendMessage(message);					}				} catch (IOException e) {					e.printStackTrace();				}				break;			}		}	}}
4.配置文件applicationContext.xml:


<context:annotation-config/>
<context:component-scan base-package="com.tw"/>

tw-servlet.xml:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"	xmlns:mvc="http://www.springframework.org/schema/mvc"	xmlns:websocket="http://www.springframework.org/schema/websocket"	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd		http://www.springframework.org/schema/websocket http://www.springframework.org/schema/websocket/spring-websocket-4.1.xsd">	<context:component-scan base-package="com.tw.controller" />    <mvc:annotation-driven>    <mvc:message-converters register-defaults="true">	<!-- 避免IE执行AJAX时,返回JSON出现下载文件 -->	<bean id="fastJsonHttpMessageConverter"		class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">		<property name="supportedMediaTypes">			<list>				<value>application/json;charset=UTF-8</value>			</list>		</property>	</bean>	</mvc:message-converters>	</mvc:annotation-driven>	<!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->	<!-- <bean		class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">		<property name="messageConverters">			<list>				<ref bean="fastJsonHttpMessageConverter" />			</list>		</property>	</bean> -->	<!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 -->	<bean		class="org.springframework.web.servlet.view.InternalResourceViewResolver">		<property name="viewClass"			value="org.springframework.web.servlet.view.JstlView" />		<property name="prefix" value="/"></property>		<property name="suffix" value=".jsp"></property>	</bean>    <!-- 支持上传文件 -->      <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>        <mvc:interceptors>      <mvc:interceptor>        <mvc:mapping path="/**"/>        <bean class="com.tw.interceptor.PermissionAnnotationInterceptor">          <property name="excludeUrls">            <list>              <value>/menu/init</value>              <value>/menu/tree</value>              <value>/user/login</value>              <value>/user/logout</value>              <value>/user/init</value>              <value>/user/reg</value>              <value>/user/regu</value>              <value>/permission/init</value>              <value>/index</value>              <value>/pcrimg</value>              <value>/init</value>            </list>          </property>        </bean>      </mvc:interceptor>    </mvc:interceptors></beans>
这里就加了个:xmlns:websocket="http://www.springframework.org/schema/websocket"

http://www.springframework.org/schema/websocket http://www.springframework.org/schema/websocket/spring-websocket-4.1.xsd


web.xml 没有任何特殊的。


5.在需要显示消息的页面这样做:

<%@ page language="java" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <title>hi</title>      </head>    <body>    dsdsds    <span id="msgcount"></span>    <script type="text/javascript" charset="UTF-8" src="${pageContext.request.contextPath}/js/jquery.min.js"></script>    <script type="text/javascript" charset="UTF-8" src="${pageContext.request.contextPath}/js/sockjs-0.3.4.min.js"></script><script type="text/javascript">var websocket;if ('WebSocket' in window) {    websocket = new WebSocket("ws://localhost:8080/tw/webSocketServer");} else {    websocket = new SockJS("http://localhost:8080/tw/sockjs/webSocketServer");}websocket.onopen = function (evnt) {};websocket.onmessage = function (evnt) {    $("#msgcount").html("(<font color='red'>"+evnt.data+"</font>)")};websocket.onerror = function (evnt) {};websocket.onclose = function (evnt) {}</script>  </body></html>
6.在controller里面就可以这样调用了:


@Bean	public SystemWebSocketHandler systemWebSocketHandler(){		return new SystemWebSocketHandler();	}		@RequestMapping("/auditing")    @ResponseBody    public String auditing(HttpServletRequest request){        //无关代码都省略了        systemWebSocketHandler().sendMessageToUser("admin", new TextMessage("你好"));        return "";    }

这些代码就可以放在自己需要的任何地方了。

基本就这样了,你想做web聊天室 或  web的网页消息提示都可以。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Spring整合WebSocket应用示例(上)
java 实现websocket的两种方式
利用spring
spring security 3.1配置过程从简单到复杂详细配置
SSM三大框架整合详细教程(Spring+SpringMVC+MyBatis)
使用websocket遇到的一个小问题 The remote endpoint was in state [TEXT
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服