WebSocket笔记+SpringBoot整合WebSocke

WebSocket笔记

webSocket:HTML5 WebSocket设计出来的目的就是取代轮询和长连接,使客户端浏览器具备像C/S框架下桌面系统的即时通讯能力,实现了浏览器和服务器全双工通信,建立在TCP之上,虽然WebSocket和HTTP一样通过TCP来传输数据,但WebSocket可以主动的向对方发送或接收数据,就像Socket一样;并且WebSocket需要类似TCP的客户端和服务端通过握手连接,连接成功后才能互相通信。

优点:双向通信、事件驱动、异步、使用ws或wss协议的客户端能够真正实现意义上的推送功能。

缺点:少部分浏览器不支持。

示例:社交聊天(微信、QQ)、弹幕、多玩家玩游戏、协同编辑、股票基金实时报价、体育实况更新、视频会议/聊天、基于位置的应用、在线教育、智能家居等高实时性的场景。

构造函数

WebSocket(url[, protocols\])返回一个 WebSocket 对象。

常量

ConstantValue
WebSocket.CONNECTING0
WebSocket.OPEN1
WebSocket.CLOSING2
WebSocket.CLOSED3

属性

方法

事件

使用 addEventListener() 或将一个事件监听器赋值给本接口的 on*eventname* 属性,来监听下面的事件。

  • close

    当一个 WebSocket 连接被关闭时触发。 也可以通过 onclose 属性来设置。

  • error

    当一个 WebSocket 连接因错误而关闭时触发,例如无法发送数据时。 也可以通过 onerror 属性来设置.

  • message

    当通过 WebSocket 收到数据时触发。 也可以通过 onmessage 属性来设置。

  • open

    当一个 WebSocket 连接成功时触发。 也可以通过 onopen 属性来设置。

示例

// Create WebSocket connection.
const socket = new WebSocket('ws://localhost:8080');

// Connection opened
socket.addEventListener('open', function (event) {
    socket.send('Hello Server!');
});

// Listen for messages
socket.addEventListener('message', function (event) {
    console.log('Message from server ', event.data);
});

SpringBoot整合WebSocket

Pom.xml文件

	<!-- websocket依赖 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-websocket</artifactId>
		</dependency>

配置类

@Configuration
public class WebSocketConfig {

    @Bean
    public ServerEndpointExporter serverEndpointExporter(){
        return new ServerEndpointExporter();
    }
}

WebSocket服务器类

@ServerEndpoint(value = "/websocketTest/{userId}")
@Component
@Slf4j
public class TestWebSocket {
    private static Map<String,Session> userMap = new HashMap<>();

    @OnOpen//当一个 `WebSocket` 连接成功时触发
    public void onOpen(Session session, @PathParam("userId") String userId){
        userMap.put(session.getId(), session);
        log.debug("新创建连接:{}", userId);
    }

    @OnClose//当一个 `WebSocket` 连接被关闭时触发
    public void onClose(Session session){
        //关闭时从内从中移除聊天信息
        userMap.remove(session.getId());
        log.debug("连接:{}断开",session.getId());
    }

    @OnMessage//当一个 `WebSocket` 连接被关闭时触发
    public void onMessage(String message,Session session) throws IOException {
        log.debug("收到用户{}的消息{}",session.getId(),message);
        //广播形式发送消息
        Iterator<Map.Entry<String, Session>> radioBroadcast = userMap.entrySet().iterator();
        while(radioBroadcast.hasNext()){
            Map.Entry<String, Session> next = radioBroadcast.next();
            next.getValue().getBasicRemote().sendText(session.getId()+"发送消息为:"+message);
        }
    }

    @OnError//当一个 `WebSocket` 连接因错误而关闭时触发
    public void onError(Session session,Throwable error){
        log.debug("用户id为:{}连接发送错误",session.getId());
        error.printStackTrace();
    }
}

前端页面

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
websocket Demo---- user000 <br />
<input id="text" type="text" />
<button onclick="send()"> Send </button>
<button onclick="closeWebSocket()"> Close </button>
<div id="message">   </div>
<script type="text/javascript">
    //判断当前浏览器是否支持WebSocket
    if('WebSocket' in window){
        console.log("link success");

        websocket = new WebSocket("ws://localhost:8080/websocketTest/user001");
    }else{
        alert('Not support websocket')
    }

    //连接发生错误的回调方法
    websocket.onerror = function(){
        setMessageInnerHTML("error");
    };

    //连接成功建立的回调方法
    websocket.onopen = function(event){
        setMessageInnerHTML("open");
    };

    //接收到消息的回调方法
    websocket.onmessage = function(event){
        setMessageInnerHTML(event.data);
    };

    //连接关闭的回调方法
    websocket.onclose = function(){
        setMessageInnerHTML("close");
    };

    //将消息显示在网页上
    function setMessageInnerHTML(innerHTML){
        document.getElementById('message').innerHTML += innerHTML + '<br/>';
    }

    //发送消息
    function send(){
        var message = document.getElementById('text').value;
        websocket.send(message);
    }
    
     //关闭连接
    function closeWebSocket(){
        websocket.close();
    }
    
    //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
    window.onbeforeunload = function(){
        websocket.close();
    };
</script>

</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值