博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring Websocket 开发
阅读量:6996 次
发布时间:2019-06-27

本文共 5672 字,大约阅读时间需要 18 分钟。

hot3.png

Websocket Spring 搭建网页聊天
注册服务
package com.web.socket;import org.springframework.context.annotation.Bean;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.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@EnableWebMvc@EnableWebSocketpublic class WebSocketConfig extends WebMvcConfigurerAdapter implements		WebSocketConfigurer{	@Override	public void registerWebSocketHandlers(WebSocketHandlerRegistry registry)	{	    // 注册一个消息实现类		registry.addHandler(systemWebSocketHandler(), "/websocket")				.addInterceptors(new WebSocketHandshakeInterceptor());	}	@Bean	public WebSocketHandler systemWebSocketHandler()	{		return new SystemWebSocketHandler();	}}
握手协议
package com.web.socket;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.support.HttpSessionHandshakeInterceptor;/** * 握手协议处理,主要封装用户信息* @author 高国藩* @date 2015年8月14日 上午10:57:53 */public class WebSocketHandshakeInterceptor extends HttpSessionHandshakeInterceptor{	@Override	public void afterHandshake(ServerHttpRequest arg0, ServerHttpResponse arg1,			WebSocketHandler arg2, Exception arg3)	{		System.out.println("enter the afterHandshake");	}	/**	 * 握手协议,在握手之间即通话链接之前,无论成功与否都会执行	 * @param handler 目标handler,此时就是本程序中的SystemWebSocketHandler.java,都是在WebSocketConfig.java中注册的	 * @param attribute 数据存入,可以在WebSocketSession中取出	 */	@Override	public boolean beforeHandshake(ServerHttpRequest request,			ServerHttpResponse arg1, WebSocketHandler handler,			Map
attribute) throws Exception { System.out.println("enter the beforeHandshake"); if(request instanceof ServerHttpRequest){ ServletServerHttpRequest servletRequest=(ServletServerHttpRequest) request; HttpSession session=servletRequest.getServletRequest().getSession(false); if(session!=null){ String userName=(String) session.getAttribute(Constants.SESSION_USERNAME); System.out.println("userName+++++++++++++"+userName); // 这里不知道有什么用 attribute.put(Constants.WEBSOCKET_USERNAME, userName); } } return true; }}
发送消息
package com.web.socket;import java.io.IOException;import java.util.ArrayList;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;public class SystemWebSocketHandler implements WebSocketHandler{	// 创建一个集合存放websocketsession	private static final ArrayList
users; static { users = new ArrayList<>(); } //连接以创建以后执行的方法 @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { users.add(session); String userName = (String) session.getAttributes().get( Constants.WEBSOCKET_USERNAME); System.out.println(userName+" 链接成功... "); if (userName != null) { // 查询未读消息 } } //接收客户端发送过来的方法 @Override public void handleMessage(WebSocketSession session, WebSocketMessage
message) throws Exception { String userName = (String) session.getAttributes().get( Constants.WEBSOCKET_USERNAME); System.out.print(userName+" 用户发送了消息:"); System.out.println(message.getPayload().toString()); TextMessage message1=new TextMessage(userName+" say "+"您好,您的消息已经收到了"); sendMessageToUsers(message1); sendMessageToUser("高国藩", message1); } //传输错误时触发 @Override public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { if (session.isOpen()) { session.close(); } users.remove(session); } //连接关闭时触发 @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { users.remove(session); } @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(Constants.WEBSOCKET_USERNAME) .equals(userName)) { try { if (user.isOpen()) { user.sendMessage(message); } } catch (IOException e) { e.printStackTrace(); } break; } } }}
config目录下的两个配置xml
core.xml
springmvc.xml
通信jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"	pageEncoding="UTF-8"%>Testing websockets	105015			
项目结构
项目下载地址
http://download.csdn.net/detail/u014201191/9119159

转载于:https://my.oschina.net/gaoguofan/blog/752897

你可能感兴趣的文章