Spring WebSocket简单入门测试Demo(网页及时聊天)
来源:互联网 发布:java equals重写 编辑:程序博客网 时间:2024/06/06 17:54
Spring WebSocket简单入门测试Demo(网页及时聊天)
说明
本demo运行的环境是:ssm框架 + tomcat8 + jdk7+,由于只是demo。很简陋。能运行调式通过就行,再在此基础上进行扩展研究。
在网上看了很多列子。对于没有接触过websocket的人来说。真的是看不懂。本文列子应该算是比较简单的。
Spring WebSocket API的核心接口是WebSocketHandler。我把它叫做消息处理中心。
其他的详细解说可以参考别人的博客
<servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
mvc的url-pattern 配置成 / 应该是拦截所有的访问请求?如果controller中有对应的地址就处理,没有就放行? 这一块不是太明白
pom.xml,版本自行查找。spring4.0+以上,在部署项目的时候。记得把tomcat8加入到jar包库(在eclipse中就是那个build path 中的 libraries )
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-websocket</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-messaging</artifactId> </dependency>
WebSocketConfig 配置
由于之前使用xml配置,和springmvc中的地址冲突(忘记了是什么情况下发生的了,有可能是我访问地址访问错了)。就使用了注解配置类的形式配置
import cn.zymx.webTM.web.controller.HandshakeInterceptor;import cn.zymx.webTM.web.controller.WebSocketHander;import org.springframework.context.annotation.Configuration;import org.springframework.web.socket.config.annotation.EnableWebSocket;import org.springframework.web.socket.config.annotation.WebSocketConfigurer;import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;/*** Created by zhuqiang on 2015/6/23 0023. */@Configuration@EnableWebSocket//开启websocketpublic class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(new WebSocketHander(),"/echo").addInterceptors(new HandshakeInterceptor()); //支持websocket 的访问链接 registry.addHandler(new WebSocketHander(),"/sockjs/echo").addInterceptors(new HandshakeInterceptor()).withSockJS(); //不支持websocket的访问链接 }}
HandshakeInterceptor 拦截器
import org.springframework.http.server.ServerHttpRequest;import org.springframework.http.server.ServerHttpResponse;import org.springframework.http.server.ServletServerHttpRequest;import org.springframework.web.socket.WebSocketHandler;import javax.servlet.http.HttpSession;import java.util.Map;/** * Created by zhuqiang on 2015/6/22 0022. */public class HandshakeInterceptor implements org.springframework.web.socket.server.HandshakeInterceptor { //进入hander之前的拦截 @Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Map<String, Object> map) throws Exception { if (request instanceof ServletServerHttpRequest) { ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request; HttpSession session = servletRequest.getServletRequest().getSession(false); String userName = "xq"; if (session != null) { //使用userName区分WebSocketHandler,以便定向发送消息// String userName = (String) session.getAttribute("WEBSOCKET_USERNAME"); map.put("WEBSOCKET_USERNAME",userName); } } return true; } @Override public void afterHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Exception e) { }}
WebSocketHandler 消息处理中心
import org.apache.log4j.Logger;import org.springframework.web.socket.*;import java.io.IOException;import java.util.ArrayList;/** * Created by zhuqiang on 2015/6/22 0022. */public class WebSocketHander implements WebSocketHandler { private static final Logger logger = Logger.getLogger(WebSocketHander.class); private static final ArrayList<WebSocketSession> users = new ArrayList<>(); //初次链接成功执行 @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { logger.debug("链接成功......"); users.add(session); String userName = (String) session.getAttributes().get("WEBSOCKET_USERNAME"); if(userName!= null){ //查询未读消息 int count = 5; session.sendMessage(new TextMessage(count + "")); } } //接受消息处理消息 @Override public void handleMessage(WebSocketSession webSocketSession, WebSocketMessage<?> webSocketMessage) throws Exception { sendMessageToUsers(new TextMessage(webSocketMessage.getPayload() + "")); } @Override public void handleTransportError(WebSocketSession webSocketSession, Throwable throwable) throws Exception { if(webSocketSession.isOpen()){ webSocketSession.close(); } logger.debug("链接出错,关闭链接......"); users.remove(webSocketSession); } @Override public void afterConnectionClosed(WebSocketSession webSocketSession, CloseStatus closeStatus) throws Exception { logger.debug("链接关闭......" + closeStatus.toString()); users.remove(webSocketSession); } @Override public boolean supportsPartialMessages() { return false; } /** * 给所有在线用户发送消息 * * @param message */ public void sendMessageToUsers(TextMessage message) { for (WebSocketSession user : users) { try { if (user.isOpen()) { user.sendMessage(message); } } catch (IOException e) { e.printStackTrace(); } } } /** * 给某个用户发送消息 * * @param userName * @param message */ public void sendMessageToUser(String userName, TextMessage message) { for (WebSocketSession user : users) { if (user.getAttributes().get("WEBSOCKET_USERNAME").equals(userName)) { try { if (user.isOpen()) { user.sendMessage(message); } } catch (IOException e) { e.printStackTrace(); } break; } } }}
页面
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <script src="http://cdn.sockjs.org/sockjs-0.3.min.js"></script> <!-- 新 Bootstrap 核心 CSS 文件 --> <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css"> <!-- 可选的Bootstrap主题文件(一般不用引入) --> <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap-theme.min.css"> <!-- jQuery文件。务必在bootstrap.min.js 之前引入 --> <script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script> <!--<script type="text/javascript" src="js/jquery-1.7.2.js"></script>--> <!-- 最新的 Bootstrap 核心 JavaScript 文件 --> <script src="//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script> <title>webSocket测试</title> <script type="text/javascript"> $(function(){ var websocket; if (‘WebSocket‘ in window) { alert("WebSocket"); websocket = new WebSocket("ws://127.0.0.1:8080/echo"); } else if (‘MozWebSocket‘ in window) { alert("MozWebSocket"); websocket = new MozWebSocket("ws://echo"); } else { alert("SockJS"); websocket = new SockJS("http://127.0.0.1:8080/sockjs/echo"); } websocket.onopen = function (evnt) { $("#tou").html("链接服务器成功!") }; websocket.onmessage = function (evnt) { $("#msg").html($("#msg").html() + "<br/>" + evnt.data); }; websocket.onerror = function (evnt) { }; websocket.onclose = function (evnt) { $("#tou").html("与服务器断开了链接!") } $(‘#send‘).bind(‘click‘, function() { send(); }); function send(){ if (websocket != null) { var message = document.getElementById(‘message‘).value; websocket.send(message); } else { alert(‘未与服务器链接.‘); } } }); </script></head><body><div class="page-header" id="tou"> webSocket及时聊天Demo程序</div><div class="well" id="msg"></div><div class="col-lg"> <div class="input-group"> <input type="text" class="form-control" placeholder="发送信息..." id="message"> <span class="input-group-btn"> <button class="btn btn-default" type="button" id="send" >发送</button> </span> </div><!-- /input-group --></div><!-- /.col-lg-6 --></div><!-- /.row --></body></html>
0 0
- Spring WebSocket简单入门测试Demo(网页及时聊天)
- Spring WebSocket简单入门测试Demo(网页及时聊天)
- java+html5的websocket简单实现BS聊天DEMO实例
- 基于Spring+SpringMVC+MyBatis+Websocket的网页聊天尝试
- Spring之WebSocket网页聊天以及服务器推送
- Spring之WebSocket网页聊天以及服务器推送
- webSocket 入门示例demo (tomcat8),最简单demo
- html5 nodejs&websocket聊天demo
- WebSocket简单聊天
- websocket 入门系列:三 netty实现简单聊天
- SSM框架+WebSocket实现网页聊天(Spring+SpringMVC+MyBatis+WebSocket)
- webSocket 入门demo
- Spring Boot + WebSocket Demo
- php websocket 简单DEMO
- websocket实现简单聊天程序
- 一个基于netty的websocket聊天demo
- 使用 Spring Boot websocket 写简单网页聊天室
- Spring 学习——基于Spring WebSocket 和STOMP实现简单的聊天功能
- [ULK11]信号(一):一些基本概念
- 两个开发中常用到的
- JS中的window.setTimeout()详解
- CSS设置元素水平居中、垂直居中方式汇总
- 关于沉浸式状态栏
- Spring WebSocket简单入门测试Demo(网页及时聊天)
- Android Camera 调用系统相机应用
- android中minLines和maxLines的区别
- linux下,使用lvm 创建、扩充 、缩减 逻辑磁盘大小,以及相应的文件系统大小
- wifidog标准流程描述
- webService-axis2方式生成客户端
- java反射之方法反射的基本操作
- Nginx做负载均衡器以及proxy缓存配置
- 树莓派linux驱动学习之LED控制