重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章将为大家详细讲解有关使用webSocket需要注意什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
从网站建设到定制行业解决方案,为提供成都网站建设、网站设计服务体系,各种行业企业客户提供网站建设解决方案,助力业务快速发展。创新互联公司将不断加快创新步伐,提供优质的建站服务。
一种网络通信协议,是 HTML5
开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
HTTP 协议的缺陷:通信只能由客户端发起,且服务端不能主动向客户端发送资源。
如果想要知道服务端是否准备好资源,只有采用轮询方式请求,浪费资源(因为必须不停连接,或者 HTTP 连接始终打开), websocket正是解决了这一问题,可以实现双向通信。
WebSocket目前支持两种统一资源标志符ws
和wss
,类似于HTTP和HTTPS,主要是加密与非加密的两种协议。
一图看懂HTTP与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 @Slf4j public class CustomWebSocket { // 用来存放每个客户端对应的MyWebSocket对象 全局对象 private static CopyOnWriteArraySetuser = 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); }
WebSocket服务端 由spring管理后,默认是单例,但是对于WebSocket对象,每个连接会新建一个对象, 因此需要注意static关键字的优雅使用。一个session对应一个会话。
特别注意这段代码,使用了static 修饰是类属性,用来存储所有连接的客户端信息。 static CopyOnWriteArraySetuser = 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需要注意什么”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。