使用webSocket需要注意什么

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

从网站建设到定制行业解决方案,为提供成都网站建设、网站设计服务体系,各种行业企业客户提供网站建设解决方案,助力业务快速发展。创新互联公司将不断加快创新步伐,提供优质的建站服务。

1. 什么是webSocket

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

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

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

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

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

使用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
@Slf4j
public 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需要注意什么”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。


名称栏目:使用webSocket需要注意什么
链接分享:http://scyanting.com/article/jeppdp.html