springboot整合websocket实现控制输入流

2023-12-13 14:35:11

WebSocket 是一种在客户端和服务器之间进行实时双向通信的协议。它提供了一种更高效、更可靠的替代方案,以替代传统的HTTP请求-响应模式。

WebSocket 的特点包括:

  1. 双向通信:客户端和服务器可以同时发送和接收消息,而不像HTTP一样需要等待响应。
  2. 实时性:与HTTP相比,WebSocket 提供了更快的响应时间,因为它在建立连接之后保持持久连接,避免了每次请求都需要重新建立连接的开销。
  3. 更少的数据传输:因为WebSocket 的连接是持久的,所以不再需要在每次通信时传输额外的HTTP头部,从而减少了通信时的数据量。
  4. 低延迟和高效性: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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。