最后
分布式技术专题+面试解析+相关的手写和学习的笔记pdf
还有更多Java笔记分享如下:
三、双向实时通信websocket
=================
3.1 整合websocket
org.springframework.boot
spring-boot-starter-websocket
复制代码
开启websocket功能
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
复制代码
3.2 websocket 用法实验
WebSocketServer内容的一些核心代码,websocket服务端代码
-
@ServerEndpoint(value = “/ws/asset”)表示websocket的接口服务地址
-
@OnOpen注解的方法,为连接建立成功时调用的方法
-
@OnClose注解的方法,为连接关闭调用的方法
-
@OnMessage注解的方法,为收到客户端消息后调用的方法
-
@OnError注解的方法,为出现异常时调用的方法
/**
- WebSocket服务端示例
*/
@Component
@Slf4j
@ServerEndpoint(value = “/ws/asset”)
public class WebSocketServer {
private static final AtomicInteger OnlineCount = new AtomicInteger(0);
// concurrent包的线程安全Set,用来存放每个客户端对应的Session对象。
private static CopyOnWriteArraySet SessionSet = new CopyOnWriteArraySet<>();
/**
- 连接建立成功调用的方法
*/
@OnOpen
public void onOpen(Session session) throws IOException {
SessionSet.add(session);
int cnt = OnlineCount.incrementAndGet(); // 在线数加1
log.info(“有连接加入,当前连接数为:{}”, cnt);
SendMessage(session, “连接成功”);
}
/**
- 连接关闭调用的方法
*/
@OnClose
public void onClose(Session session) {
SessionSet.remove(session);
int cnt = OnlineCount.decrementAndGet();
log.info(“有连接关闭,当前连接数为:{}”, cnt);
}
/**
-
收到客户端消息后调用的方法
-
@param message 客户端发送过来的消息
*/
@OnMessage
public void onMessage(String message, Session session) throws IOException {
log.info(“来自客户端的消息:{}”,message);
SendMessage(session, “收到消息,消息内容:”+message);
}
/**
- 出现错误
*/
public void onError(Session session, Throwable error) {
log.error(“发生错误:{},Session ID: {}”,error.getMessage(),session.getId());
}
/**
-
发送消息,实践表明,每次浏览器刷新,session会发生变化。
-
@param session session
-
@param message 消息
*/
private static void SendMessage(Session session, String message) throws IOException {
session.getBasicRemote().sendText(String.format(“%s (From Server,Session ID=%s)”,message,session.getId()));
}
/**
-
群发消息
-
@param message 消息
*/
public static void BroadCastInfo(String message) throws IOException {
for (Session session : SessionSet) {
if(session.isOpen()){
SendMessage(session, message);
}
}
}
/**
-
指定Session发送消息
-
@param sessionId sessionId
-
@param message 消息
*/
public static void SendMessage(String sessionId,String message) throws IOException {
Session session = null;
for (Session s : SessionSet) {
if(s.getId().equals(sessionId)){
session = s;
break;
}
}
if(session!=null){
SendMessage(session, message);
} else{
log.warn(“没有找到你指定ID的会话:{}”,sessionId);
}
}
}
复制代码
客户端代码,做几次实验,自然明了代码的意思,先不要看代码,先看效果。public/wstest/html
WebSocket测试,在控制台查看测试信息输出!
http://localhost:8888/api/ws/sendOne?message=单发消息内容&id=none
http://localhost:8888/api/ws/sendAll?message=群发消息内容
请输入要发送给服务器端的消息:
发送服务器消息
关闭连接
信息:
复制代码
测试页面
http://localhost:8888/wstest.html
3.3 服务端广播与指定session消息发送
@RestController
@RequestMapping(“/api/ws”)
public class WebSocketController {
/**
-
群发消息内容
-
@param message 消息内容
*/
@RequestMapping(value=“/sendAll”, method=RequestMethod.GET)
AjaxResponse sendAllMessage(@RequestParam String message){
try {
WebSocketServer.BroadCastInfo(message);
} catch (IOException e) {
throw new CustomException(CustomExceptionType.SYSTEM_ERROR,“群发消息失败”);
}
return AjaxResponse.success();
最后
光给面试题不给答案不是我的风格。这里面的面试题也只是凤毛麟角,还有答案的话会极大的增加文章的篇幅,减少文章的可读性
Java面试宝典2021版
最常见Java面试题解析(2021最新版)
2021企业Java面试题精选
片转存中…(img-eE5cEPQs-1715582759428)]
[外链图片转存中…(img-fS63xiSu-1715582759429)]
最常见Java面试题解析(2021最新版)
[外链图片转存中…(img-H5yzwbyY-1715582759429)]
[外链图片转存中…(img-Z7JBW8IV-1715582759430)]
2021企业Java面试题精选
[外链图片转存中…(img-OLDROTam-1715582759431)]
[外链图片转存中…(img-dLjiwtDW-1715582759431)]