RealInoutSocketHandler.java 1.76 KB
package com.bsth.websocket.handler;

import com.bsth.data.msg_queue.WebSocketPushQueue;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.*;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * @author PanZhao
 */
@Component
public class RealInoutSocketHandler implements WebSocketHandler {

	Logger logger = LoggerFactory.getLogger(this.getClass());

	private static ArrayList<WebSocketSession> users;
	private static ConcurrentHashMap<String, CopyOnWriteArrayList<WebSocketSession>> listenMap;

	static {
		users = new ArrayList<WebSocketSession>();
		listenMap = new ConcurrentHashMap();
	}

	@Override
	public void afterConnectionClosed(WebSocketSession session, CloseStatus arg1)
			throws Exception {
		users.remove(session);
	}

	@Override
	public void afterConnectionEstablished(WebSocketSession session)
			throws Exception {
		users.add(session);
	}

	@Override
	public void handleMessage(WebSocketSession session, WebSocketMessage<?> msg)
			throws Exception {
		logger.info(msg.getPayload().toString());
	}

	@Override
	public void handleTransportError(WebSocketSession session, Throwable arg1)
			throws Exception {
		if(session.isOpen()){
			session.close();
		}
		users.remove(session);
	}

	@Override
	public boolean supportsPartialMessages() {
		return false;
	}


	/**
	 * 全局推送
	 */
	public void sendMessage(String msg) {

		TextMessage message = new TextMessage(msg.getBytes());

		Iterator<WebSocketSession> iterator = users.iterator();

		WebSocketSession user;
		while(iterator.hasNext()){
			user = iterator.next();
			WebSocketPushQueue.put(user, message);
		}
	}
}