首次使用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
@Slf4j
public class CustomWebSocket {

	// 用来存放每个客户端对应的MyWebSocket对象 全局对象
	private static CopyOnWriteArraySet<CustomWebSocket> user = new CopyOnWriteArraySet<CustomWebSocket>();
	// 与某个客户端的连接会话,需要通过它来给客户端发送数据
	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<CustomWebSocket> user = new CopyOnWriteArraySet<CustomWebSocket>();

 

转载于:https://my.oschina.net/woniuyi/blog/3097606

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值