Websocket的环境搭建与测试
来源:互联网 发布:二手淘宝纸箱开槽机 编辑:程序博客网 时间:2024/06/10 20:14
Spring websocket环境配置及简单示例
1,准备好相关依赖包,spring核心包以及spring-websocket-4.3.6release.jar, javax.websocket-api-1.0.jar。导入项目。
2,新建一个WebSocketConfig.java放在mvc自动扫描的Controller中,详细代码如下:
import org.springframework.context.annotation.Bean; import com.database.websocket.*;import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 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 @EnableWebMvc @EnableWebSocket public class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { //允许连接的域,只能以http或https开头 // String[] allowsOrigins = {"http://www.xxx.com"}; String[] allowsOrigins ={"*"}; //WebIM WebSocket通道 registry.addHandler(chatWebSocketHandler(),"/webSocketIMServer").setAllowedOrigins(allowsOrigins).addInterceptors(myInterceptor()); registry.addHandler(chatWebSocketHandler(),"/sockjs/webSocketIMServer").setAllowedOrigins(allowsOrigins).addInterceptors(myInterceptor()).withSockJS(); } @Bean public ChatWebSocketHandler chatWebSocketHandler() { return new ChatWebSocketHandler(); } @Bean public WebSocketHandshakeInterceptor myInterceptor(){ return new WebSocketHandshakeInterceptor(); } }
3,新建一个websocket的包,新建一个WebSocketHandshakeInterceptor.java文件作为握手拦截器,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.web.socket.WebSocketHandler; import org.springframework.web.socket.server.HandshakeInterceptor; public class WebSocketHandshakeInterceptor implements HandshakeInterceptor { private static final String SESSION_NAME ="username"; private String userName; @Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,Map<String, Object> attributes) throws Exception { if (request instanceof ServletServerHttpRequest) { HttpSession session = ((ServletServerHttpRequest)request).getServletRequest().getSession(); userName= (String) session.getAttribute(SESSION_NAME); if(userName == null) { userName= "访客" + session.getId() ; session.setAttribute(SESSION_NAME,userName); } attributes.put("username",userName); } return true; } @Override public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response,WebSocketHandler wsHandler, Exception exception) { }}
4,新建一个ChatWebSocketHandler.java文件用于处理收发消息以及处理连接成功和断开连接的操作,详细代码如下:
import java.io.IOException;import java.util.ArrayList;import java.util.Collections;import java.util.List;import org.springframework.web.socket.CloseStatus;import org.springframework.web.socket.TextMessage;import org.springframework.web.socket.WebSocketSession;import org.springframework.web.socket.handler.TextWebSocketHandler;public class ChatWebSocketHandler extends TextWebSocketHandler{ private final static List<WebSocketSession> sessions =Collections.synchronizedList(new ArrayList<WebSocketSession>()); //接收文本消息,并发送出去 @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { super.handleTextMessage(session,message); message=new TextMessage("hello:"+message.getPayload()); sendMessageToUsers(session,message);//发送所有人 } //连接建立后处理 @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { System.out.println("connect to thewebsocket chat success......"); sessions.add(session); //处理离线消息 } //抛出异常时处理 public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { if(session.isOpen()){ session.close(); } System.out.println("websocket chatconnection closed......"); sessions.remove(session); } //连接关闭后处理 public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { System.out.println("websocket chatconnection closed......"); sessions.remove(session); } @Override public boolean supportsPartialMessages() { return false; } //发送消息方法 private void sendMessageToUsers(WebSocketSession session,TextMessage message) throws IOException { //循环在线会话,发送消息 for (WebSocketSession itemSession : sessions) { if(itemSession.isOpen()) { itemSession.sendMessage(message); } } } }
5,最后,就是做客户端页面的请求发送以及消息接受,这里新添加一个reconnecting-websocket.min.js。这个js文件对websocket做了比较好的封装,更为方便的使用。前端页面和js代码如下:
<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPEhtml PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>Inserttitle here</title> </head> <body> Welcome<br/><input id="text"type="text"/> <button onclick="send()">发送消息</button> <hr/> <button onclick="closeWebSocket()">关闭WebSocket连接</button> <hr/> <div id="message"></div> <script type="text/javascript" src="js/reconnecting-websocket.min.js"></script><script type="text/javascript"> var websocket = null; //判断当前浏览器是否支持WebSocket if('WebSocket' in window) { websocket = new WebSocket("ws://192.168.0.174:8080/Journal/webSocketIMServer"); } else{ alert('当前浏览器 Not support websocket') } //连接发生错误的回调方法 websocket.onerror = function () { //需要部署在Tomcat7.0.47以上的版本才能运行 setMessageInnerHTML("WebSocket连接发生错误"); }; //连接成功建立的回调方法 websocket.onopen = function () { setMessageInnerHTML("WebSocket连接成功"); } //接收到消息的回调方法 websocket.onmessage = function (event) { setMessageInnerHTML(event.data); } //连接关闭的回调方法 websocket.onclose = function () { setMessageInnerHTML("WebSocket连接关闭"); } //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。 window.onbeforeunload = function () { closeWebSocket(); } //将消息显示在网页上 function setMessageInnerHTML(innerHTML) { document.getElementById('message').innerHTML += innerHTML +'<br/>'; } //关闭WebSocket连接 function closeWebSocket() { websocket.close(); } //发送消息 function send() { var message = document.getElementById('text').value; websocket.send(message); } </script> </body> </html>
最后,在js的请求发送那里记得改为服务器上的 IP地址就可以实现websocket之间的简单通信啦。
阅读全文
0 0
- Websocket的环境搭建与测试
- 搭建与测试Spring的开发环境
- 搭建与测试Spring的开发环境
- 搭建与测试Spring的开发环境
- 搭建与测试Spring的开发环境
- Arduino编程环境的搭建与测试
- php运行环境与测试环境的搭建
- 测试环境的搭建
- Struts2环境搭建与测试
- hadoop环境搭建与测试
- Hibernate环境搭建与测试
- MQTT环境搭建与测试
- WebSocket 的性能与压力测试
- 搭建Android开发环境与测试环境
- 基于Peers与miniSipServer的VoIP测试环境的搭建
- 基于Python selenium2的测试环境的搭建与安装
- (2)搭建与测试 Spring 的开发环境
- (1)搭建与测试 Spring 的开发环境
- hack技术
- 频偏计算方式
- 第三周-项目一(1)顺序表的基本运算
- 第三周项目4
- git删除sub module
- Websocket的环境搭建与测试
- get汉字转化
- Tomcat学习--禁止tomcat日志中stderr和stdout日志打印
- Fragment中不同路径参数请求和PullrefreshListview多条目加载
- LeetCode-63-Unique Paths II DP水题
- AndroidSDK篇之SlidingMenu的集成
- 传输控制协议TCP(一,概述,首部)
- Jenkins 必装插件
- u-boot-1.1.6顶层目录Makefile非常详细的分析