在springboot项目中,配置socket,实现服务端和客户端的连接,实现内网穿透,客户端和服务端可以互相访问API,这些API原来是要通过内网穿透才可以访问的,现在通过socket实现,服务端和客户端不在同一个局域网,给一个详细的demo,包括需要用到的包和依赖,每一步都要越详细越好,每一行都要写注释。首先服务端是暴露在公网的,IP:yp43942467.zicp.vip,端口:39156。
时间: 2023-10-11 10:09:32 浏览: 110
Socket实现服务端与客户端通讯
4星 · 用户满意度95%
好的,下面是一个基于Spring Boot框架的示例demo,实现了内网穿透和Socket连接:
1. 首先,在你的pom.xml文件中添加以下依赖:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
```
2. 在Spring Boot应用程序中,首先需要创建WebSocket配置类,用于配置WebSocket的相关信息。在这个配置类中,我们需要指定WebSocket的端点和处理器。
```java
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
// 定义WebSocket端点,客户端会使用它连接到WebSocket服务器
registry.addHandler(myHandler(), "/myHandler")
.setAllowedOrigins("*") // 允许跨域访问
.withSockJS(); // 开启SockJS支持
}
@Bean
public WebSocketHandler myHandler() {
return new MyHandler();
}
}
```
3. 接下来,我们需要定义WebSocket处理器,它用于处理客户端发来的消息并返回响应。
```java
public class MyHandler implements WebSocketHandler {
private static final Logger logger = LoggerFactory.getLogger(MyHandler.class);
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
logger.info("连接成功,sessionId={}", session.getId());
// 将新连接的session添加到管理列表中
WebSocketSessionManager.addSession(session);
}
@Override
public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
logger.info("收到消息,sessionId={}, message={}", session.getId(), message.getPayload());
// 处理客户端发来的消息
String response = "收到消息:" + message.getPayload();
session.sendMessage(new TextMessage(response));
}
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
logger.error("连接出现错误,sessionId={}", session.getId(), exception);
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
logger.info("连接关闭,sessionId={}", session.getId());
// 将关闭的session从管理列表中移除
WebSocketSessionManager.removeSession(session);
}
@Override
public boolean supportsPartialMessages() {
return false;
}
}
```
4. 接下来,我们需要定义一个WebSocketSession管理器,用于管理所有连接的WebSocketSession。
```java
@Component
public class WebSocketSessionManager {
private static final Logger logger = LoggerFactory.getLogger(WebSocketSessionManager.class);
private static final List<WebSocketSession> sessions = new CopyOnWriteArrayList<>();
public static void addSession(WebSocketSession session) {
sessions.add(session);
logger.info("添加新的WebSocketSession,sessionId={}", session.getId());
}
public static void removeSession(WebSocketSession session) {
sessions.remove(session);
logger.info("移除WebSocketSession,sessionId={}", session.getId());
}
public static List<WebSocketSession> getSessions() {
return sessions;
}
public static void sendMessageToAllSessions(WebSocketMessage<?> message) {
for (WebSocketSession session : sessions) {
try {
session.sendMessage(message);
} catch (IOException e) {
logger.error("发送消息失败,sessionId={}", session.getId(), e);
}
}
}
}
```
5. 最后,我们需要在Controller中处理客户端发来的请求,并将请求转发给WebSocket处理器。
```java
@RestController
public class MyController {
@Autowired
private SimpMessagingTemplate messagingTemplate;
@GetMapping("/api")
public String api(HttpServletRequest request) {
// 处理API请求
String response = "处理API请求";
return response;
}
@MessageMapping("/sendMessage")
public void sendMessage(String message) {
// 将客户端发来的消息转发给WebSocket处理器
WebSocketSessionManager.sendMessageToAllSessions(new TextMessage(message));
}
}
```
6. 至此,我们已经完成了Spring Boot项目的配置。接下来,我们需要使用内网穿透工具,将我们的服务端暴露在公网上,以便客户端可以连接它。
7. 在客户端中,我们需要创建一个WebSocket连接,并通过它发送和接收消息。
```javascript
var socket = new SockJS('http://yp43942467.zicp.vip:39156/myHandler');
// 连接成功时触发
socket.onopen = function () {
console.log('WebSocket连接已打开');
};
// 接收到消息时触发
socket.onmessage = function (event) {
console.log('收到消息:' + event.data);
};
// 连接关闭时触发
socket.onclose = function () {
console.log('WebSocket连接已关闭');
};
// 发送消息
socket.send('Hello, WebSocket!');
```
这样,我们就完成了内网穿透和Socket连接的示例demo。希望对你有所帮助。
阅读全文