springboot整合websocket实现控制输入流
2023-12-13 14:35:11
WebSocket 是一种在客户端和服务器之间进行实时双向通信的协议。它提供了一种更高效、更可靠的替代方案,以替代传统的HTTP请求-响应模式。
WebSocket 的特点包括:
- 双向通信:客户端和服务器可以同时发送和接收消息,而不像HTTP一样需要等待响应。
- 实时性:与HTTP相比,WebSocket 提供了更快的响应时间,因为它在建立连接之后保持持久连接,避免了每次请求都需要重新建立连接的开销。
- 更少的数据传输:因为WebSocket 的连接是持久的,所以不再需要在每次通信时传输额外的HTTP头部,从而减少了通信时的数据量。
- 低延迟和高效性:WebSocket 使用二进制协议传输数据,相比于文本协议,具有更快的速度和更低的延迟。
使用WebSocket 可以实现实时聊天、实时数据更新、多人协同编辑等功能。在Web开发中,可以使用WebSocket API 来实现前后端的实时通信,同时也有许多流行的JavaScript库和框架(如Socket.IO)提供了更简单和方便的使用方式。
需要注意的是,WebSocket 需要浏览器和服务器双方都支持该协议才能进行通信。目前大多数现代浏览器都支持WebSocket,而服务器端需要使用支持WebSocket 的服务器软件或库来处理WebSocket 连接。
实现(通过信号量)?
websocket类
@Slf4j
@ServerEndpoint(value = "/ws/live")
@Component
public class LiveStreamingWebsocket {
private Session session;
private Thread thread;
@OnOpen
public void open(Session session) throws AuthenticationException, ConnectException {
}
@OnMessage
public void message(String message, Session session) {
if (isOpen) {
if (StringUtils.equals(message, "start")) {
Runnable runnable = new LiveThread(message, session);
thread = new Thread(runnable);
thread.start();
Signal.stop = false;
} else if (StringUtils.equals(message, "end")) {
if (thread.isAlive()) {
thread.interrupt();
Signal.stop = true;
log.info("====================stop======================");
}
}
}
}
@OnError
public void error(Throwable throwable) {
log.error("An error has occurred:{}", throwable.getMessage());
// release();
}
@OnClose
public void close() {
if (isOpen) {
release();
}
}
private void release() {
}
public void sendMessage(String text, boolean async) {
log.info("send message " + text + " sessionId=" + this.session.getId());
try {
this.session.getBasicRemote().sendText(text);
} catch (IOException e) {
log.error("send message error " + text + " sessionId=" + this.session.getId());
e.printStackTrace();
}
}
}
?线程类
@Slf4j
@AllArgsConstructor
@NoArgsConstructor
public class LiveThread implements Runnable {
private String message;
private Session session;
@Override
public void run() {
while (!Signal.stop) {
}
}
public void sendMessage(String text, boolean async) {
log.info("send message " + text + " sessionId=" + this.session.getId());
try {
this.session.getBasicRemote().sendText(text);
} catch (IOException e) {
log.error("send message error " + text + " sessionId=" + this.session.getId());
e.printStackTrace();
}
}
}
信号量类
public class Signal {
public static volatile boolean stop=false;
}
运行后通过输入start和end即可控制流的使用
文章来源:https://blog.csdn.net/weixin_44808225/article/details/134965174
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!