先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
正文
@GetMapping(“/payback”)
public @ResponseBody String payback (){
SseEmitter emitter = sseEmitters.get(1L);
try {
emitter.send(“支付成功”);
System.out.println(“发送finish事件”);
emitter.send(SseEmitter.event().name(“finish”).id(“6666”).data(“哈哈”));
System.out.println(“调用complete”);
emitter.complete();
} catch (IOException e) {
emitter.completeWithError(e);
}
return “ok”;
}
}
复制代码
对连接超时异常进行全局处理
@ExceptionHandler(AsyncRequestTimeoutException.class)
@ResponseBody
public String handleAsyncRequestTimeoutException(AsyncRequestTimeoutException e) {
return SseEmitter.event().data(“timeout!!”).build().stream()
.map(d -> d.getData().toString())
.collect(Collectors.joining());
}
复制代码
2.2访问测试
=======
http://localhost:8888/sse/test
http://localhost:8888/sse/payback
三、双向实时通信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=群发消息内容
请输入要发送给服务器端的消息:
发送服务器消息
关闭连接
信息: