本文讲解如何SpringBoot如何使用WebSocket进行一对一发送消息,如果想学习SpringBoot结合Websocket群发消息,可以前往查看我的上一篇文章:SpringBoot使用WebSocket(一)
导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
新建Websocket配置类
/**
* @author Gjing
**/
@Configuration
public class WebsocketConfiguration {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
新建消息对象
/**
* @author Gjing
**/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Message {
private String userId;
private String message;
}
新建websocket服务
/**
* @author Gjing
**/
@ServerEndpoint("/test-one")
@Component
@Slf4j
public class MyOneToOneServer {
/**
* 用于存放所有在线客户端
*/
private static Map<String, Session> clients = new ConcurrentHashMap<>();
private Gson gson = new Gson();
@OnOpen
public void onOpen(Session session) {
log.info("有新的客户端上线: {}", session.getId());
clients.put(session.getId(), session);
}
@OnClose
public void onClose(Session session) {
String sessionId = session.getId();
log.info("有客户端离线: {}", sessionId);
clients.remove(sessionId);
}
@OnError
public void onError(Session session, Throwable throwable) {
throwable.printStackTrace();
if (clients.get(session.getId()) != null) {
clients.remove(session.getId());
}
}
@OnMessage
public void onMessage(String message) {
log.info("收到客户端发来的消息: {}", message);
this.sendTo(gson.fromJson(message, Message.class));
}
/**
* 发送消息
*
* @param message 消息对象
*/
private void sendTo(Message message) {
Session s = clients.get(message.getUserId());
if (s != null) {
try {
s.getBasicRemote().sendText(message.getMessage());
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
测试
- 上线两个客户端
- 使用其中一个客户端发送消息给另外一个,只需要带上另外一个客户端的id
- 接收方客户端
本文中只介绍了最简单的业务处理方式,更深层次的处理各位请自行学习,demo源代码地址为:springboot-websocket