Browse Source

websocket初步搭建

master
ccsens_zhengzhichuan 2 weeks ago
parent
commit
c3c09356a2
  1. 18
      pom.xml
  2. 4
      research-framework/pom.xml
  3. 17
      research-framework/src/main/java/com/research/framework/config/WebSocketClientConfig.java
  4. 27
      research-framework/src/main/java/com/research/framework/config/WebSocketServerConfig.java
  5. 91
      research-framework/src/main/java/com/research/framework/config/handler/WebSocketClientHandler.java
  6. 34
      research-framework/src/main/java/com/research/framework/config/handler/WebSocketServerHandler.java
  7. 4
      research-system/pom.xml
  8. 9
      research-system/src/main/java/com/research/system/domain/vo/SessionVo.java
  9. 12
      research-system/src/main/resources/mapper/dao/SessionDao.xml

18
pom.xml

@ -241,19 +241,11 @@
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.0</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-websocket</artifactId>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-web</artifactId>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>com.alibaba.fastjson2</groupId>-->
<!-- <artifactId>fastjson2</artifactId>-->
<!-- <version>2.0.50</version>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
<version>2.7.10</version>
</dependency>
</dependencies>
</dependencyManagement>

4
research-framework/pom.xml

@ -62,6 +62,10 @@
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
</dependency>
</dependencies>

17
research-framework/src/main/java/com/research/framework/config/WebSocketClientConfig.java

@ -0,0 +1,17 @@
package com.research.framework.config;
import com.research.framework.config.handler.WebSocketClientHandler;
import org.springframework.context.annotation.Bean;
/**
* @Author zzc
* @Package com.research.framework.config
* @Date 2025/11/25 17:14
* @description:
*/
public class WebSocketClientConfig {
@Bean
public WebSocketClientHandler myWebSocketClientHandler() {
return new WebSocketClientHandler();
}
}

27
research-framework/src/main/java/com/research/framework/config/WebSocketServerConfig.java

@ -0,0 +1,27 @@
package com.research.framework.config;
import com.research.framework.config.handler.WebSocketServerHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
/**
* @Author zzc
* @Package com.research.framework.config
* @Date 2025/11/25 13:47
* @description:
*/
public class WebSocketServerConfig implements WebSocketConfigurer {
@Bean
public WebSocketHandler webSocketHandler() {
return new WebSocketServerHandler();
}
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry
.addHandler(webSocketHandler(), "/ws")//添加处理器并指定WebSocket的endpoint端点
.setAllowedOrigins("*"); //允许跨域访问
}
}

91
research-framework/src/main/java/com/research/framework/config/handler/WebSocketClientHandler.java

@ -0,0 +1,91 @@
package com.research.framework.config.handler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.socket.*;
import org.springframework.web.socket.client.WebSocketClient;
import org.springframework.web.socket.client.standard.StandardWebSocketClient;
import javax.annotation.PreDestroy;
/**
* @Author zzc
* @Package com.research.framework.config.handler
* @Date 2025/11/25 17:14
* @description:
*/
@Slf4j
public class WebSocketClientHandler extends StandardWebSocketClient implements WebSocketHandler {
private WebSocketSession session;
private String url = "ws://localhost:38001/ws";
/**
* 连接WebSocket服务端
*/
@Scheduled(fixedDelay = 60000) // 每隔1分钟连接一次
public void connect() throws Exception {
WebSocketClient client = new StandardWebSocketClient();
session = client.doHandshake(new WebSocketClientHandler(), url).get();
log.info("Client: WebSocket connection established");
}
/**
* 关闭WebSocket连接
*/
@PreDestroy
public void close() throws Exception {
session.close();
}
/**
* @param message:向服务端发送的消息
*/
public void sendMessage(String message) throws Exception {
session.sendMessage(new TextMessage(message));
}
// @Scheduled(fixedDelay = 5000)
// public void sendMessage() throws Exception {
// session.sendMessage(new TextMessage("message"));
// }
/**
* 处理连接后的逻辑
* @param session:WebSocketSession域对象,有获取通信信息,发送消息,打开关闭通道等等功能
*/
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
log.info("Client: WebSocket connection established");
}
/**
* 处理客户端发送的消息
* @param session:WebSocketSession域对象,有获取通信信息,发送消息,打开关闭通道等等功能
* @param message:客户端发送的文本消息
*/
@Override
public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
log.info("Client: Received message: " + message.getPayload());
session.sendMessage(new TextMessage("Client: Hello, server!"));
}
/**
* 处理发生的错误
* @param session:WebSocketSession域对象,有获取通信信息,发送消息,打开关闭通道等等功能
* @param exception:通信出现的异常
*/
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
log.info("Client: Error Occurred: " + exception.getMessage());
}
/**
* 连接关闭
*/
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
log.info("Client: Connection Closed");
}
/**
* 用于判断服务器或客户端是否支持分片消息partial message
* WebSocket 协议规范要求所有的 WebSocket 实现都必须支持接收和处理完整的消息
* @return boolean
*/
@Override
public boolean supportsPartialMessages() {
return false;
}
}

34
research-framework/src/main/java/com/research/framework/config/handler/WebSocketServerHandler.java

@ -0,0 +1,34 @@
package com.research.framework.config.handler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
/**
* @Author zzc
* @Package com.research.framework.config.handler
* @Date 2025/11/25 13:50
* @description:
*/
@Slf4j
public class WebSocketServerHandler extends TextWebSocketHandler {
/**
* 处理连接后的逻辑
* @param session:WebSocketSession域对象,有获取通信信息,发送消息,打开关闭通道等等功能
*/
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
log.info("Server: WebSocket connection established");
}
/**
* 处理客户端发送的消息
* @param session:WebSocketSession域对象,有获取通信信息,发送消息,打开关闭通道等等功能
* @param message:客户端发送的文本消息
*/
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
log.info("Server: Received message: " + message.getPayload());
session.sendMessage(new TextMessage("Server: Hello, client!"));
}
}

4
research-system/pom.xml

@ -37,6 +37,10 @@
<artifactId>hutool-all</artifactId>
<version>5.8.24</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
</dependencies>
</project>

9
research-system/src/main/java/com/research/system/domain/vo/SessionVo.java

@ -2,6 +2,7 @@ package com.research.system.domain.vo;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.research.common.utils.SecurityUtils;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ -30,6 +31,7 @@ public class SessionVo {
private String lastMessage;
@ApiModelProperty("最后消息时间")
private Date lastMessageTime;
private String orgName;
private Long senderId;
}
@ -61,6 +63,7 @@ public class SessionVo {
private Long messageId;
@ApiModelProperty
private Long senderId;
private String senderName;
@ApiModelProperty
private String content;
@ApiModelProperty
@ -68,6 +71,12 @@ public class SessionVo {
@ApiModelProperty
private Date sendTime;
private Byte readStatus;
private String avatar;
private String orgName;
public boolean isMine(){
return senderId.equals(SecurityUtils.getUserId());
}
}
@Data

12
research-system/src/main/resources/mapper/dao/SessionDao.xml

@ -16,7 +16,8 @@ select * from
m.content as lastMessage,
m.create_time as lastMessageTime,
m.sender_id as senderId,
s.create_time as createTime
s.create_time as createTime,
null
FROM
chat_sessions s
LEFT JOIN chat_session_messages m on s.id = m.session_id
@ -36,7 +37,8 @@ select * from
'',
null,
l.user_id as senderId,
null
null,
L.org_name AS orgName
FROM
chat_contact_list l
LEFT JOIN chat_session_members sm on sm.session_member_id = l.user_id and sm.is_creator = 1
@ -70,9 +72,13 @@ select * from
m.content,
m.content_type as contentType,
m.create_time AS sendTime,
s.read_status as readStatus
s.read_status as readStatus,
cl.nick_name as senderName,
cl.avatar,
cl.org_name as orgName
FROM chat_session_messages m
left join chat_message_read_status s on m.session_id = s.session_id and m.id = s.session_message_id and s.del_status = 0
left join chat_contact_list cl on cl.user_id = m.sender_id
WHERE m.session_id = #{sessionId}
ORDER BY m.create_time DESC
</select>

Loading…
Cancel
Save