在springboot项目中,配置socket,实现服务端和客户端的连接,实现内网穿透,客户端和服务端可以互相访问API,这些API原来是要通过内网穿透才可以访问的,现在通过socket实现,服务端和客户端不在同一个局域网,给一个详细的demo,包括需要用到的包和依赖,每一步都要越详细越好,每一行都要写注释。首先服务端是暴露在公网的,IP:yp43942467.zicp.vip,端口:39156,客户端和服务端都是springboot项目
时间: 2023-11-16 17:07:54 浏览: 198
好的,下面我会详细介绍实现方法,包括需要用到的包和依赖以及每一步的详细代码和注释。
1. 首先在服务端项目中添加以下依赖:
```xml
<!-- SpringBoot Websocket 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<!-- Tomcat WebSocket 依赖 -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-websocket</artifactId>
</dependency>
```
2. 在服务端项目中创建一个WebSocketConfig类,用于配置WebSocket。
```java
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
/**
* 注册WebSocket处理器
*/
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
// 注册WebSocket处理器,并设置允许跨域访问
registry.addHandler(new MyWebSocketHandler(), "/websocket").setAllowedOrigins("*");
}
}
```
在这个类中,我们使用@EnableWebSocket注解开启WebSocket支持,实现WebSocketConfigurer接口,并重写registerWebSocketHandlers方法,注册一个WebSocket处理器,并设置允许跨域访问。
3. 创建一个自定义的WebSocket处理器MyWebSocketHandler。
```java
public class MyWebSocketHandler extends TextWebSocketHandler {
private static final Map<String, WebSocketSession> sessionMap = new ConcurrentHashMap<>();
/**
* 当有新的WebSocket连接时,将WebSocketSession添加到sessionMap中
*/
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
sessionMap.put(session.getId(), session);
}
/**
* 当WebSocket连接断开时,将WebSocketSession从sessionMap中移除
*/
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
sessionMap.remove(session.getId());
}
/**
* 处理客户端发送的消息
*/
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
// 将收到的消息发送给所有连接的客户端(除了自己)
for (WebSocketSession s : sessionMap.values()) {
if (!s.getId().equals(session.getId())) {
s.sendMessage(message);
}
}
}
}
```
在这个类中,我们继承了TextWebSocketHandler,实现了WebSocket的处理逻辑。在afterConnectionEstablished方法中,我们将WebSocketSession添加到sessionMap中,在afterConnectionClosed方法中,我们将WebSocketSession从sessionMap中移除。在handleTextMessage方法中,我们处理客户端发送的消息,并将收到的消息发送给所有连接的客户端(除了自己)。
4. 在客户端项目中添加以下依赖:
```xml
<!-- SpringBoot Websocket 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<!-- Tomcat WebSocket 依赖 -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-websocket</artifactId>
</dependency>
```
5. 创建一个WebSocketService类,用于连接服务端WebSocket。
```java
@Service
public class WebSocketService {
/**
* WebSocket客户端
*/
private WebSocketClient webSocketClient;
/**
* WebSocket连接
*/
private WebSocketSession webSocketSession;
/**
* 连接WebSocket
*/
public void connect() throws Exception {
// 创建WebSocket客户端
webSocketClient = new StandardWebSocketClient();
// 创建WebSocket连接
webSocketSession = webSocketClient.doHandshake(new MyWebSocketHandler(), "ws://yp43942467.zicp.vip:39156/websocket").get();
}
/**
* 发送消息
*/
public void send(String message) throws Exception {
// 发送消息
webSocketSession.sendMessage(new TextMessage(message));
}
/**
* 关闭连接
*/
public void close() throws Exception {
// 关闭连接
webSocketSession.close();
}
}
```
在这个类中,我们使用@Service注解将这个类注入为SpringBean,在connect方法中,我们创建一个WebSocket客户端,并连接到服务端的WebSocket地址,然后通过doHandshake方法获取一个WebSocketSession。在send方法中,我们发送消息给服务端的WebSocket,可以通过webSocketSession.sendMessage方法发送消息。在close方法中,我们关闭WebSocket连接。
6. 在控制器中调用WebSocketService。
```java
@RestController
public class TestController {
@Autowired
private WebSocketService webSocketService;
/**
* 发送WebSocket消息
*/
@GetMapping("/send")
public String send() throws Exception {
// 连接WebSocket
webSocketService.connect();
// 发送消息
webSocketService.send("Hello, WebSocket!");
// 关闭WebSocket连接
webSocketService.close();
return "Send WebSocket Message Success!";
}
}
```
在这个控制器中,我们使用@Autowired注解注入WebSocketService,并在send方法中调用WebSocketService的connect、send、close方法,实现与服务端WebSocket的连接和消息发送。
至此,我们完成了在springboot项目中配置socket,实现服务端和客户端的连接,实现内网穿透,客户端和服务端可以互相访问API的过程。
阅读全文