目录
一、项目依赖
<!-- web启动包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<!-- 去除内置tomcat -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- jetty容器替代Tomcat -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
因为jetty从版本7以后自己内置实现了websocket,所以在依赖文件中就不需要引入其他webscoket依赖包
二、实现方式
1、方式一:使用注解
springBoot启动类
@SpringBootApplication
@ServletComponentScan // 必需---> 这个注解为了扫描自定义servlet
public class JettyWeSocketApplication {
public static void main(String[] args) {
SpringApplication.run(JettyWeSocketApplication .class, args);
}
}
配置webscoket
import org.eclipse.jetty.websocket.servlet.WebSocketServlet;
import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory;
import javax.servlet.annotation.WebServlet;
/**
* @author wlp
* @version 1.0.0
* @description 描述:配置自定义SocketServlet,并指定注册WebSocket的处理类
* @date 2021/6/5 0:30
*/
@WebServlet(urlPatterns = {"/websocket"})
public class JettyWebsocketServlet extends WebSocketServlet {
@Override
public void configure(WebSocketServletFactory webSocketServletFactory) {
// 设置连接多久不活跃自动断开 ---》默认为 300000ms
webSocketServletFactory.getPolicy().setIdleTimeout(100000);
webSocketServletFactory.register(JettyWebsocket.class);
}
}
2、方式二:交给spring容器管理
(1) 启动类则不需要@ServletComponentScan 这个注解
(2) 自定义JettyWebsocketServlet 也不需要@WebServlet 这个注解
(3) 配置bean交由spring 管理
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.http.HttpServlet;
/**
* @author wlp
* @version 1.0.0
* @description 描述:配置JettyWebsocketServlet交给spring容器管理
* @date 2021/6/5 13:15
*/
@Configuration
public class JettyWebsocketConfig {
@Bean
public ServletRegistrationBean<HttpServlet> jettyWebsocket1() {
ServletRegistrationBean<HttpServlet> registrationBean = new ServletRegistrationBean<>();
// 指定JettyWebsocketServlet
registrationBean.setServlet(new JettyWebsocketServlet());
// 指定servlet处理的请求地址
registrationBean.addUrlMappings("/websocket");
return registrationBean;
}
}
三、处理连接、信息
WebSocket处理类
import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketConnect;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage;
import org.eclipse.jetty.websocket.api.annotations.WebSocket;
import lombok.extern.slf4j.Slf4j;
/**
* @author wlp
* @version 1.0.0
* @description 描述:自定义Websocket处理
* @date 2021/6/5 0:28
*/
@WebSocket
@Slf4j
public class JettyWebsocket {
Session session;
/**
* <p> 方法描述:连接关闭处理 </p>
*
* @param statusCode 状态码
* @param reason 信息
* @author wlp
* @date 2021/6/5 0:48
*/
@OnWebSocketClose
public void onClose(int statusCode, String reason) {
// TODO: 写自己的逻辑代码
}
/**
* <p> 方法描述:socket连接 </p>
*
* @param session 会话信息
* @author wlp
* @date 2021/6/5 13:06
*/
@OnWebSocketConnect
public void onConnect(Session session) {
log.info("开始连接: {}", session.getClass());
this.session = session;
}
/***
* <p> 方法描述:接收信息处理 </p>
*
* @param msg 接收的信息
* @author wlp
* @date 2021/6/5 13:07
*/
@OnWebSocketMessage
public void onMessage(String msg) {
log.info("接受信息: {}", msg);
try {
// 发送信息出去
session.getRemote().sendString("后端返回信息----》" + msg);
} catch (Throwable t) {
t.printStackTrace();
log.error("信息发送异常:{}", t.getMessage());
}
}
}
四、项目启动测试
WebSocket在线测试工具
测试结果:
至此简易聊天就完成了