VUE项目如何使用WebSocket

此处我就不对webSocket协议的原理优势做阐述了。

前端vue-WebSocket连接

export default {
  components: {
  },
  data() {
    return {
      websockLink: ''
    }
  },
  watch: {
    websockLink(val) {
      if (val) {
        this.initWebSocket()
      }
    }
  },
  methods: {
    initWebSocket() {
      this.websock = new WebSocket(this.websockLink)
      this.websock.onopen = this.websocketonopen
      this.websock.onerror = this.websocketonerror
      this.websock.onmessage = this.websocketonmessage
      this.websock.onclose = this.websocketclose
    },
    websocketonopen() {
      console.log('WebSocket连接成功')
    },
    websocketonerror(e) {
      console.log('WebSocket连接发生错误')
    },
    websocketonmessage(e) {
      console.log('WebSocket信息通知')
    },
    websocketclose(e) {
      console.log('关闭WebSocket连接')
    }
  },
  created() {
  },
  destroyed() {
    this.websocketclose()
  },
  mounted() {
    this.websockLink = global.BASE_API.replace('http', 'ws').replace('https', 'ws') + '/zs/websocket'
  }
}

后端WebSocket连接

  1. WebSocket配置
@Configuration
public class WebSocketConfig
{
	/**
	 * 注入ServerEndpointExporter, 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket
	 * endpoint
	 *
	 * @return
	 */
	@Bean
	public ServerEndpointExporter serverEndpointExporter()
	{
		return new ServerEndpointExporter();
	}
}
  1. WebSocket连接
@Component
@ServerEndpoint(value = "/zs/websocket")
public class CustomWebSocket
{
	/**
	 * 静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
	 */
	private static int									onlineCount		= 0;
	/**
	 * concurrent包的线程安全Set,用来存放每个客户端对应的CumWebSocket对象。
	 */
	private static CopyOnWriteArraySet<CustomWebSocket>	webSocketSet	= new CopyOnWriteArraySet<CustomWebSocket>();
	/**
	 * 与某个客户端的连接会话,需要通过它来给客户端发送数据
	 */
	private Session										session;

	/**
	 * 连接建立成功调用的方法
	 *
	 * @param session
	 */
	@OnOpen
	public void onOpen(Session session)
	{
		this.session = session;
		// 加入set中
		webSocketSet.add(this);
		// 添加在线人数
		addOnlineCount();
		System.out.println("新连接接入。当前在线人数为:" + getOnlineCount());
	}

	/**
	 * 连接关闭调用的方法
	 */
	@OnClose
	public void onClose()
	{
		// 从set中删除
		webSocketSet.remove(this);
		// 在线数减1
		subOnlineCount();
		System.out.println("有连接关闭。当前在线人数为:" + getOnlineCount());
	}

	/**
	 * 收到客户端消息后调用
	 *
	 * @param message
	 * @param session
	 */
	@OnMessage
	public void onMessage(String message, Session session)
	{
		System.out.println("客户端发送的消息:" + message);
	}

	/**
	 * 暴露给外部的群发
	 *
	 * @param message
	 * @throws IOException
	 */
	public static void sendInfo(String message) throws IOException
	{
		sendAll(message);
	}

	/**
	 * 群发
	 *
	 * @param message
	 */
	private static void sendAll(String message)
	{
		Arrays.asList(webSocketSet.toArray()).forEach(item ->
		{
			CustomWebSocket customWebSocket = (CustomWebSocket) item;
			// 群发
				try
				{
					customWebSocket.sendMessage(message);
				} catch (IOException e)
				{
					e.printStackTrace();
				}
			});
	}

	/**
	 * 发生错误时调用
	 *
	 * @param session
	 * @param error
	 */
	@OnError
	public void onError(Session session, Throwable error)
	{
		System.out.println("----websocket-------有异常啦");
		error.printStackTrace();
	}

	/**
	 * 减少在线人数
	 */
	private void subOnlineCount()
	{
		CustomWebSocket.onlineCount--;
	}

	/**
	 * 添加在线人数
	 */
	private void addOnlineCount()
	{
		CustomWebSocket.onlineCount++;
	}

	/**
	 * 当前在线人数
	 *
	 * @return
	 */
	public static synchronized int getOnlineCount()
	{
		return onlineCount;
	}

	/**
	 * 发送信息
	 *
	 * @param message
	 * @throws IOException
	 */
	public void sendMessage(String message) throws IOException
	{
		// 获取session远程基本连接发送文本消息
		this.session.getBasicRemote().sendText(message);
		// this.session.getAsyncRemote().sendText(message);
	}
}

如此VUE之WebSocket的使用就ok了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值