【Spring】-- spring websocket样例

       App将做微信小程序的版本了,由于用到了TCP推送,所以需要用websocket实现一遍。利用spring 的websocket来实现还是很简单的。这里有一个非常大的坑,由于我这个是纯只做websocket连接的,想开始将spring mvc给去掉。确怎么也连不上,这里还是需要对websocket的原理知晓一些。它是先走http再走tcp的。所以spring mvc必须要!

spring mvc不在这里讨论。请看socket部分。

bom.xml


		
			org.springframework
			spring-core
			${org.springframework.version}
		
		
			org.springframework
			spring-beans
			${org.springframework.version}
		
		
			org.springframework
			spring-web
			${org.springframework.version}
		
		
			org.springframework
			spring-webmvc
			${org.springframework.mvc}
		
		
			org.springframework
			spring-context
			${org.springframework.version}
		
		
			org.springframework
			spring-context-support
			${org.springframework.version}
		
		
			org.springframework
			spring-test
			${org.springframework.version}
		
		  
           org.springframework  
           spring-websocket  
           ${org.springframework.version}  
          
          
           org.springframework  
           spring-messaging  
           ${org.springframework.version}  
        

spring websocket的核心在于注册。

@Configuration
@EnableWebMvc
@EnableWebSocket
public class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer{

	@Autowired
	WebSocketHandler webSocketHandler;
	@Autowired
	HandshakeInterceptor handshakeInterceptor;
	
	@Override
	public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
		//允许连接的域,只能以http或https开头 必须设置哦,不然会出现403的错误 failed: Error during WebSocket handshake: Unexpected response code: 403
//        String[] allowsOrigins = {"http://www.xxx.com"};
        String[] allowsOrigins = {"*"};
        
		registry.addHandler(webSocketHandler,"/appwebsocket").addInterceptors(handshakeInterceptor).setAllowedOrigins(allowsOrigins); //支持websocket 的访问链接
        registry.addHandler(webSocketHandler,"/sockjs/appwebsocket").addInterceptors(handshakeInterceptor).setAllowedOrigins(allowsOrigins).withSockJS(); //不支持websocket的访问链接
	}

}

然后是 handshakeInterceptor, 这个是握手时需要做的事情。

@Component
public class HandshakeInterceptor implements org.springframework.web.socket.server.HandshakeInterceptor{

	/**
	 * 初次握手访问前
	 */
	@Override
	public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
			Map attributes) throws Exception {
		return true;
	}
	/**
	 * 初次握手访问后
	 */
	@Override
	public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
			Exception exception) {
		
	}

}


然后是WebSocketHandler,这个是所有请求的处理类。

@Component
@Scope("prototype")
public class WebSocketHandler implements org.springframework.web.socket.WebSocketHandler{
	private static final Logger log = LoggerFactory.getLogger(WebSocketHandler.class);
	
	@Autowired
	Config config;
	@Autowired
	AllConnections allConnections;
	@Autowired
	PushCommandClient pushCommandClient;
	
	/**
	 * 初次连接成功
	 */
	@Override
	public void afterConnectionEstablished(WebSocketSession session) throws Exception {
		allConnections.putClientAppIoSession(session);
		log.info("连接成功。。。添加到链接管理,添加完后当前拥有链接数为:"+allConnections.getAppConnectionSize());
	}

	@Override
	public void handleMessage(WebSocketSession session, WebSocketMessage socketmessage) throws Exception {
		if (log.isInfoEnabled()) {
			log.info("app连接:触发handleMessage读取app信息");
		}
		if(socketmessage.getPayloadLength()==0){
			log.info("收到websocket包,包内容为空!!!");
			return;
		}
		JSONObject object = JSON.parseObject(socketmessage.getPayload().toString());
		//收到json数据,需要处理。。。
	}

	@Override
	public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
		log.error("链接出错,关闭链接......",exception);
		if(session.isOpen()){
			session.close();
        }
	}

	@Override
	public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
        if (log.isInfoEnabled()) {
			log.info("app连接:触发afterConnectionClosed移除缓存的连接,移除前连接数为:"+allConnections.getAppConnectionSize());
		}
		allConnections.removeClientAppIoSession(session);
		if (log.isInfoEnabled()) {
			log.info("app连接关闭.channel ID 为:"+session.getId()+" ip:"+session.getRemoteAddress()+",当前剩余设备连接数为:"+allConnections.getAppConnectionSize());
		}
	}

	@Override
	public boolean supportsPartialMessages() {
		return false;
	}
}



最后附上一个测试用的客户端代码!




    
    
    
    
    
    
    
    
    
    
    
    webSocket测试
    











你可能感兴趣的:(java,web,spring)