Spring Boot SockJS应用例子

[b]Spring Boot SockJS应用例子[/b]


1.SockJS用javascript实现的socket连接,兼容各种浏览器的WebSocket支持库
2.WebSocket是H5的,不支持H5的浏览器没法使用。
3.SockJS它提供类似于websocket的编程模式但是可以适应不同的浏览器(包括不支持websocket的浏览器)。


[b]后端代码:[/b]
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>



package com.cesmart;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.ComponentScan;

@EnableAutoConfiguration
@ComponentScan(basePackages = "com.cesmart") // 扫描那些包得到bean.@ComponentScan({"com.teradata.notification","com.teradata.dal"})
public class Application {
public static void main(String[] args) {
ApplicationContext applicationContext = SpringApplication.run(Application.class, args);
}
}



package com.cesmart.config;

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 MyHandler implements WebSocketHandler {
// 连接继开处理
@Override
public void afterConnectionClosed(WebSocketSession arg0, CloseStatus arg1) throws Exception {
// TODO Auto-generated method stub

System.out.println("Connection closed..." + arg0.getRemoteAddress().toString());

}

// 连接建立处理
@Override
public void afterConnectionEstablished(WebSocketSession arg0) throws Exception {
// TODO Auto-generated method stub
System.out.println("Connection established..." + arg0.getRemoteAddress().toString());
}

// 接收、发送信息处理
@Override
public void handleMessage(WebSocketSession arg0, WebSocketMessage<?> arg1) throws Exception {
// TODO Auto-generated method stub
try {
System.out.println("Req: " + arg1.getPayload());
// 发送信息
TextMessage returnMessage = new TextMessage(arg1.getPayload() + " received at server");
arg0.sendMessage(returnMessage);
} catch (Exception e) {
e.printStackTrace();
}
}

// 错误处理(客户端突然关闭等接收到的错误)
@Override
public void handleTransportError(WebSocketSession arg0, Throwable arg1) throws Exception {
// TODO Auto-generated method stub
if (arg0.isOpen()) {
arg0.close();
}
System.out.println(arg1.toString());
System.out.println("WS connection error,close...");
}

@Override
public boolean supportsPartialMessages() {
// TODO Auto-generated method stub
return false;
}
}


package com.cesmart.config;

import java.util.Map;

import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;

/**
* 类描述:拦截器
*/
public class MyHandshakeInterceptor extends HttpSessionHandshakeInterceptor {

@Override
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
Exception ex) {
// TODO Auto-generated method stub
System.out.println("After handshake " + request.getRemoteAddress().toString());
super.afterHandshake(request, response, wsHandler, ex);
}

@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler handler,
Map<String, Object> map) throws Exception {
// TODO Auto-generated method stub
System.out.println("Before handshake " + request.getRemoteAddress().toString());
return super.beforeHandshake(request, response, handler, map);
}

}



package com.cesmart.config;

import org.springframework.context.annotation.Bean;
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;

@Configuration // 配置类
@EnableWebSocket // 声明支持websocket
public class WebSocketConfig implements WebSocketConfigurer {

@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
// 注册websocket实现类,指定参数访问地址;allowed-origins="*" 允许跨域
// addHandler是增加处理接口和设定URL
// addInterceptors是增加拦截器处理(可以不用)
registry.addHandler(myHandler(), "/ws").addInterceptors(myHandshake()).setAllowedOrigins("*");
registry.addHandler(myHandler(), "/sockjs/ws").addInterceptors(myHandshake()).withSockJS();

registry.addHandler(myHandler(), "/ws2").setAllowedOrigins("*");
registry.addHandler(myHandler(), "/sockjs/ws2").setAllowedOrigins("*").withSockJS();
}

@Bean
public MyHandler myHandler() {
return new MyHandler();
}

@Bean
public MyHandshakeInterceptor myHandshake() {
return new MyHandshakeInterceptor();
}
}



[b]前端代码:[/b]
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="//cdn.bootcss.com/sockjs-client/1.1.1/sockjs.min.js"></script>
<script type="text/javascript">
var url = "127.0.0.1:8090/";
var websocket = null;
if ('WebSocket' in window) {
websocket = new WebSocket("ws://" + url + "/ws");//建立连接
} else {
websocket = new SockJS("http://" + url + "/sockjs/ws");//建立连接
}
//建立连接处理
websocket.onopen = onOpen;
//接收处理
websocket.onmessage = onMessage;
//错误处理
websocket.onerror = onError;
//断开连接处理
websocket.onclose = onClose;

function onOpen(openEvent) {
document.getElementById("console").innerHTML = document.getElementById("console").innerHTML+ "OPEN<br/>";
}

function onMessage(event) {
document.getElementById("console").innerHTML = document.getElementById("console").innerHTML+ event.data+"<br/>";
}
function onError() {
}
function onClose() {
document.getElementById("console").innerHTML = document.getElementById("console").innerHTML+ "CLOSE<br/>";
}

function doSend() {
console.log(websocket.readyState);
if (websocket.readyState == SockJS.OPEN) {
var msg = document.getElementById("message").value;
//发送消息
websocket.send(msg);
} else {
alert("连接失败!");
}
}


function disconnect(){
if (websocket != null) {
websocket.close();
websocket = null;
}
}

function reconnect(){
if (websocket != null) {
websocket.close();
websocket = null;
}
if ('WebSocket' in window) {
websocket = new WebSocket("ws://" + url + "/ws");
} else {
websocket = new SockJS("http://" + url + "/sockjs/ws");
}
websocket.onopen = onOpen;
websocket.onmessage = onMessage;
websocket.onerror = onError;
websocket.onclose = onClose;
}
</script>
</head>
<body>
<div>
<button id="disconnect" onclick="disconnect()">断开连接</button>
<button id="send" onclick="doSend()">发送消息</button>
<button id="reconnect" onclick="reconnect()">重新连接</button>
</div>
<div>
<textarea id="message" style="width: 350px">Here is a message!</textarea>
</div>
<div>日志信息:</div>
<p id="console" width="600px"></p>
</body>
</html>



参考(websocket简单应用):[url]http://wiselyman.iteye.com/blog/2003336[/url]
参考(应用例子):[url]http://768992698.iteye.com/blog/2338250[/url]
参考(应用例子(TextWebSocketHandler )):[url]http://www.cnblogs.com/likun10579/p/5594828.html[/url]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值