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;@OnOpenpublic void open(Session session) throws AuthenticationException, ConnectException {}@OnMessagepublic 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======================");}}}}@OnErrorpublic void error(Throwable throwable) {log.error("An error has occurred:{}", throwable.getMessage());
// release();}@OnClosepublic 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;@Overridepublic 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;
}