在springboot项目中,配置socket,实现服务端和客户端的连接,实现内网穿透,客户端和服务端可以互相访问API,这些API原来是要通过内网穿透才可以访问的,现在通过socket实现,服务端和客户端不在同一个局域网,给一个详细的demo,包括需要用到的包和依赖
时间: 2023-11-16 22:07:54 浏览: 102
好的,以下是一个基于Spring Boot和WebSocket的Demo,实现了内网穿透和客户端和服务端的API互相访问。
1. 首先,在pom.xml中添加以下依赖:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<dependency>
<groupId>org.jasypt</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>2.1.2</version>
</dependency>
```
2. 在application.properties中添加以下配置:
```properties
# WebSocket
server.port=8080
spring.websocket.path=/ws
spring.websocket.max-text-message-size=512000
# Jasypt加密配置
jasypt.encryptor.password=your_password
# 内网穿透工具配置
ngrok.server.address=your_ngrok_server_address
ngrok.server.port=your_ngrok_server_port
```
其中,ngrok是一个内网穿透工具,可以将本地服务映射到外网,可以在官网下载并安装使用。
3. 编写WebSocket配置类:
```java
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(new SocketHandler(), "/ws").setAllowedOrigins("*");
}
}
```
其中,SocketHandler是自定义的WebSocket处理器类。
4. 编写SocketHandler类:
```java
@Component
public class SocketHandler extends TextWebSocketHandler {
private static final Logger logger = LoggerFactory.getLogger(SocketHandler.class);
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
logger.info("Received message: {}", message.getPayload());
// 处理接收到的消息
session.sendMessage(new TextMessage("Hello, " + message.getPayload() + "!"));
}
}
```
其中,handleTextMessage方法是处理接收到的WebSocket消息的方法,这里实现了简单的回复功能。
5. 编写客户端和服务端的API接口:
```java
@RestController
@RequestMapping("/api")
public class ApiController {
@Autowired
private SimpMessagingTemplate messagingTemplate;
@PostMapping("/send")
public void sendMessage(@RequestParam String message) {
messagingTemplate.convertAndSend("/topic/message", message);
}
@MessageMapping("/message")
public void handleMessage(@Payload String message, SimpMessageHeaderAccessor headerAccessor) {
messagingTemplate.convertAndSend("/topic/message", message);
}
}
```
其中,sendMessage方法是客户端调用的API接口,handleMessage方法是服务端接收WebSocket消息后转发到客户端的方法。
6. 在ngrok上注册一个公共域名,并将其映射到本地服务的地址和端口号。
7. 启动Spring Boot项目并在浏览器中访问ngrok生成的公共域名,即可启动WebSocket连接并实现API互相访问。
以上就是一个基本的Spring Boot和WebSocket实现内网穿透的Demo,可以根据实际需求进行修改和扩展。
阅读全文