千家信息网

使用webSocket需要注意什么

发表于:2024-11-20 作者:千家信息网编辑
千家信息网最后更新 2024年11月20日,这篇文章将为大家详细讲解有关使用webSocket需要注意什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1. 什么是webSocket一种网络通信协议,是 HT
千家信息网最后更新 2024年11月20日使用webSocket需要注意什么

这篇文章将为大家详细讲解有关使用webSocket需要注意什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

1. 什么是webSocket

一种网络通信协议,是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。

  • HTTP 协议的缺陷:通信只能由客户端发起,且服务端不能主动向客户端发送资源。

  • 如果想要知道服务端是否准备好资源,只有采用轮询方式请求,浪费资源(因为必须不停连接,或者 HTTP 连接始终打开), websocket正是解决了这一问题,可以实现双向通信。

  • WebSocket目前支持两种统一资源标志符wswss,类似于HTTP和HTTPS,主要是加密与非加密的两种协议。

  • 一图看懂HTTP与webSocket的原理区别:

2. webSocket的注解及使用

  • 常用注解:

@ServerEndpoint(value = "/webSocketProxy/{nickName}")

表示一个URI映射的路径,标准的restfulAPI,{nickName}为路径参数。用于注解于类上。

@OnOpen     @OnMessage     @OnClose      @OnError

以上四个注解用于方法上,分别对应不同的事件:打开连接、收到消息、连接关闭、发生错误。当发生对应事件时,该方法将会被触发。通常开发中主要在@OnMessage方法内进行业务开发。

@PathParam("nickName")

此注解用于获取路径参数{nickName}。

  • 五种连接状态:

NOT_YET_CONNECTED, CONNECTING, OPEN, CLOSING, CLOSED;
  • 服务端的简单实例

@ServerEndpoint(value = "/customWebSocket/{nickName}")@Component@Slf4jpublic class CustomWebSocket {        // 用来存放每个客户端对应的MyWebSocket对象 全局对象        private static CopyOnWriteArraySet user = new CopyOnWriteArraySet();        // 与某个客户端的连接会话,需要通过它来给客户端发送数据        private Session session;        @OnMessage        public void onMessage(String message, Session session, @PathParam("nickName") String nickName) throws IOException {                // 群发消息                for (CustomWebSocket myWebSocket : user) {                        log.info("请求url:" + session.getRequestURI());                        myWebSocket.session.getBasicRemote().sendText(nickName + " :" + message);                        log.info("custom 收到消息:" + nickName + " :" + message);                }        }        @OnOpen        public void onOpen(Session session) {                log.info("custom " + session.getId() + " open...");                this.session = session;                user.add(this);        }        @OnClose        public void onClose() {                System.out.println("custom " + this.session.getId() + " close...");                session=null;                user.remove(this);        }        @OnError        public void onError(Session session, Throwable error) {                session=null;                log.warn("custom " + this.session.getId() + " error...",error);        }

3. WebSocket的注意事项

  • WebSocket服务端 由spring管理后,默认是单例,但是对于WebSocket对象,每个连接会新建一个对象,因此需要注意static关键字的优雅使用。一个session对应一个会话。


  • 特别注意这段代码,使用了static 修饰是类属性,用来存储所有连接的客户端信息。 static CopyOnWriteArraySet user = new CopyOnWriteArraySet();


  • 如果报错:The remote endpoint was in state [TEXT_FULL_WRITING] which is an invalid state for called method,则是存在多线程并发发送消息的情况。采用同步机制即可。

synchronized (session){    session.getBasicRemote().sendText(JSON.toJSONString(message));}

关于"使用webSocket需要注意什么"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

0