spring boot + webSocket实现多个项目之间进行通信操作
作为spring cloud微服务多个服务之间进行通信
首先至少得有一个websocket服务端 与一个或多个 websocket客户端
已提供源码免费下载,Spring Cloud alibaba nacos注册中心+【websocket服务端和websocket客户端】两个服务
/download/m0_37845840/14038629
一、首先无论是服务端还是客户端都需要添加的maven依赖
<dependency>
<groupId></groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
二、Application启动类
由于WebSocketServer服务端类使用的是@Component注解
所以启动类需要用@ComponentScan对该类进行扫描
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
@SpringBootApplication
@EnableDiscoveryClient
@EnableScheduling
@ComponentScan("")
@MapperScan(value = {""})
public class Application {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication();
ConfigurableApplicationContext configurableApplicationContext = (args);
(configurableApplicationContext);
}
}
三、WebSocketServer服务端的WebSocketConfig配置类
import ;
import ;
import ;
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
四、WebSocketServer服务端接受客户端请求连接的类
package ;
import ;
import ;
import .*;
import ;
import ;
import ;
import ;
/**
* @author Administrator
* @description
* @date 2021-01-07 10:09
*/
@Component
@ServerEndpoint(value = "/{ip}")
public class WebSocketServer {
// 在多线程访问的时候,使用线程安全的ConCurrentHashMap对象
private static ConcurrentHashMap<String, Session> connections = new ConcurrentHashMap<>();
private static ApplicationContext applicationContext;
public static void setApplicationContext(ApplicationContext applicationContext) {
= applicationContext;
}
/**
* 打开连接
* @param session
* @param ip
*/
@OnOpen
public void onOpen(Session session, @PathParam("ip") String ip) {
("=====接受到的地址=====" + ip);
// 接收到客户端的请求,可以做一些其他业务逻辑处理,比如可以把该IP存储到数据库
// 避免当前服务断开后,与客户端服务失去连接
// 这时就可以使用到预加载处理,项目当中自定义的MyApplicationRunner类
(ip, session);
}
/**
* 接收消息
* @param text
*/
@OnMessage
public void onMessage(String text) {
}
/**
* 异常处理
* @param throwable
*/
@OnError
public void onError(Throwable throwable) {
();
}
/**
* 关闭连接
* @param ip
*/
@OnClose
public void onClosing(@PathParam("ip") String ip) throws IOException {
(ip);
}
/**
* 根据IP发送消息
* @param ip
* @param text
*/
public void send(String ip, String text) {
try {
Session session = (ip);
if (session != null && ()) {
().sendText(text);
}
} catch (Exception e) {
();
}
}
/**
* 遍历群发消息
* @param text
*/
public void send(String text) {
for (<String, Session> entry : ()) {
send((), text);
}
}
}
五、SocketClient客户端服务发起连接的类
().sendText()为同步发送
().sendText()为异步发送
当并发发送数据的时候避免阻塞,一般都使用异步
import ;
import ;
import .*;
import ;
import ;
import ;
@Component
@ClientEndpoint
public class SocketClient {
// 服务端的IP和端口号
private static final String URL = "192.168.1.1:8080";
private Session session;
@PostConstruct
void init() {
try {
// 本机地址
String hostAddress = ().getHostAddress();
WebSocketContainer container = ();
String wsUrl = "ws://" + URL + "/" + hostAddress;
URI uri = (wsUrl);
session = (, uri);
} catch (DeploymentException | IOException e) {
();
}
}
/**
* 打开连接
* @param session
*/
@OnOpen
public void onOpen(Session session) {
= session;
}
/**
* 接收消息
* @param text
*/
@OnMessage
public void onMessage(String text) {
}
/**
* 异常处理
* @param throwable
*/
@OnError
public void onError(Throwable throwable) {
();
}
/**
* 关闭连接
*/
@OnClose
public void onClosing() throws IOException {
();
}
/**
* 主动发送消息
*/
public void send(JSONObject json) {
try {
().sendText(());
} catch (IOException e) {
();
}
}
}