Spring Boot 集成 socket.io 后端实现消息实时通信

bianmaren 发布于 2018-09-19 17:18:20    访问

标签 : JAVA Spring Boot

image.png

socket.io

socket.io:是一个面向实时 web 应用的 JavaScript 库。它使得服务器和客户端之间实时双向的通信成为可能。他有两个部分:在浏览器中运行的客户端库,和一个面向Node.js的服务端库。两者有着几乎一样的API。像Node.js一样,它也是事件驱动的.

Socket.IO 主要使用WebSocket协议。但是如果需要的话,Socket.io可以回退到几种其它方法,例如Adobe Flash Sockets,JSONP拉取,或是传统的AJAX拉取,[2]并且在同时提供完全相同的接口。尽管它可以被用作WebSocket的包装库,它还是提供了许多其它功能,比如广播至多个套接字,存储与不同客户有关的数据,和异步IO操作。


项目搭建

引入依赖包

io.socket

socket.io-client

1.0.0

com.corundumstudio.socketio

netty-socketio

1.7.12


创建服务端类 SocketServer

package com.socket.socketio;
import com.corundumstudio.socketio.AckRequest;
import com.corundumstudio.socketio.Configuration;
import com.corundumstudio.socketio.SocketIOClient;
import com.corundumstudio.socketio.SocketIOServer;
import com.corundumstudio.socketio.listener.ConnectListener;
import com.corundumstudio.socketio.listener.DataListener;
import com.corundumstudio.socketio.listener.DisconnectListener;
import com.socket.domain.TimeMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/**
 * socketio 服务端
 *netty-socketio 实现的 socke.io 服务端
 *
 * @author pengdh
 * @date: 2017-09-03 1:13
 */
@Component
public class SocketServer {
	private final Logger logger = LoggerFactory.getLogger(this.getClass());
	private static SocketIOServer server = initServer();
	/**
	 * 初始化服务端
	 * @return
	 */
	private static SocketIOServer initServer() {
		Configuration config = new Configuration();
		config.setHostname("localhost");
		config.setPort(9090);
		server = new SocketIOServer(config);
		return server;
	}
	/**
	 * 启动服务端
	 */
	public void startServer() {
		// 添加连接监听
		server.addConnectListener(new ConnectListener() {
			@Override
			public void onConnect(SocketIOClient socketIOClient) {
				logger.info("server 服务端启动成功");
			}
		});
		// 添加断开连接监听
		server.addDisconnectListener(new DisconnectListener() {
			@Override
			public void onDisconnect(SocketIOClient socketIOClient) {
				logger.info("server 服务端断开连接");
			}
		});
		// 添加事件监听
		server.addEventListener("join", String.class, new DataListener() {
			@Override
			public void onData(SocketIOClient socketIOClient, String str,
					AckRequest ackRequest)
					throws Exception {
				logger.info("收到客户端加入消息:" + str);
				server.getBroadcastOperations().sendEvent("joinSuccess", "join success");
			}
		});
		// 添加事件监听
		server.addEventListener("chatMessage", TimeMessage.class, new DataListener() {
			@Override
			public void onData(SocketIOClient socketIOClient, TimeMessage message,
					AckRequest ackRequest)
					throws Exception {
				logger.info("收到客户端消息:" + message.toString());
				server.getBroadcastOperations().sendEvent("return message", message.toString());
			}
		});
		// 启动服务端
		server.start();
	}
	/**
	 * 停止服务端
	 */
	public void stopServer() {
		server.stop();
	}
}

本文转载至:http://alexpdh.com/2017/09/03/springboot-socketio/