spring-boot websocket 配置和实现(包括html)

简单几步,在spring-boot项目中配置和实现websocket的服务端和html客户端:

1、引入依赖:
		
			org.springframework.boot
			spring-boot-starter-websocket
		

2、配置文件配置
@Configuration
public class WebSocketConfig {
	@Bean
	public ServerEndpointExporter serverEndpointExporter(){
		return new ServerEndpointExporter();
	}
}

3、服务端实现
@ServerEndpoint("/my-websocket")
@Component
public class MyWebSocket {
	protected final Logger logger = LoggerFactory.getLogger(this.getClass());

	private static int onlineCount = 0;
	private static CopyOnWriteArraySet webSocketSet = new CopyOnWriteArraySet<>();

	private Session session;

	@OnOpen
	public void onOpen(Session session) throws IOException{
		this.session = session;
		webSocketSet.add(this);
		incrOnlineCount();
		for(MyWebSocket item : webSocketSet){
			if(!item.equals(this)) { //send to others only.
				item.sendMessage("someone just joined in.");
			}
		}
		logger.info("new connection...current online count: {}", getOnlineCount());
	}

	@OnClose
	public void onClose() throws IOException{
		webSocketSet.remove(this);
		decOnlineCount();
		for(MyWebSocket item : webSocketSet){
			item.sendMessage("someone just closed a connection.");
		}
		logger.info("one connection closed...current online count: {}", getOnlineCount());
	}

	@OnMessage
	public void onMessage(String message, Session session) throws IOException {
		logger.info("message received: {}", message);
		// broadcast received message
		for(MyWebSocket item : webSocketSet){
			item.sendMessage(message);
		}
	}

	public void sendMessage(String message) throws IOException {
		this.session.getBasicRemote().sendText(message);
	}

	public static synchronized int getOnlineCount(){
		return MyWebSocket.onlineCount;
	}

	public static synchronized void incrOnlineCount(){
		MyWebSocket.onlineCount++;
	}

	public static synchronized void decOnlineCount(){
		MyWebSocket.onlineCount--;
	}
}

4、客户端(html+vue.js)实现



	
	My WebSocket

	


Welcome To My WebSocket.


5、效果
第一个客户端:
spring-boot websocket 配置和实现(包括html)_第1张图片
第二个客户端:
spring-boot websocket 配置和实现(包括html)_第2张图片

源代码参考: https://github.com/xujijun/my-spring-boot

注意:上面这种配置有个缺点,就是MyWebSocket类里面无法使用@Value或@Autowired之类的Spring注入。
所以,更简单的结合Spring的实现方法如下:
第2步,配置,改为:
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
	@Override
	public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
		registry.addHandler(CmdHandler(), "/my-websocket"); //url和handler的mapping
	}

	@Bean
	public WebSocketHandler CmdHandler() {
		return new CmdHandler();
	}
}

第3步,服务端的实现,改为:
public class CmdHandler extends TextWebSocketHandler {
	protected final Logger logger = LoggerFactory.getLogger(this.getClass());

	@Value("${spring.profiles}")
	private String env;

	@Autowired
	MyService myService;

	@Override
	public void handleTextMessage(WebSocketSession session, TextMessage message) {
		TextMessage msg = new TextMessage("Hello, " + message.getPayload() + "!");

		logger.info("message received: {}", message.getPayload());
		try {
				session.sendMessage(msg);
		}
		}catch (IOException e){
			logger.error(e.getMessage(), e);
		}
	}
}






你可能感兴趣的:(Spring,Boot)