spring-boot-websocket-netty-server, 依赖spring-boot-parent
Spring Boot: user notifications with web socket
This example will shows how to send notifications, via web socket, to specific logged-in users.
Could be useful, for example, if you are trying to implement a real-time user notification system.
Build and run
springboot启动后: http://localhost/
Configurations
<dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.12.Final</version> </dependency>
@SpringBootApplication public class NettyWebSocketServerApplication implements CommandLineRunner{ @Autowired private ChatServer chatServer; public static void main(String[] args) { SpringApplication.run(NettyWebSocketServerApplication.class, args); } @Bean public ChatServer chatServer() { return new ChatServer(); } @Override public void run(String... args) throws Exception { InetSocketAddress address = new InetSocketAddress("127.0.0.1", 9090); ChannelFuture future = chatServer.start(address); Runtime.getRuntime().addShutdownHook(new Thread(){ @Override public void run() { chatServer.destroy(); } }); future.channel().closeFuture().syncUninterruptibly(); } }
public class ChatServerInitializer extends ChannelInitializer<Channel>{
private final ChannelGroup group;
public ChatServerInitializer(ChannelGroup group) {
this.group = group;
}
@Override
protected void initChannel(Channel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
//处理日志
pipeline.addLast(new LoggingHandler(LogLevel.INFO));
//处理心跳
pipeline.addLast(new IdleStateHandler(0, 0, 1800, TimeUnit.SECONDS));
pipeline.addLast(new ChatHeartbeatHandler());
pipeline.addLast(new HttpServerCodec());
pipeline.addLast(new ChunkedWriteHandler());
pipeline.addLast(new HttpObjectAggregator(64 * 1024));
pipeline.addLast(new HttpRequestHandler("/ws"));
pipeline.addLast(new WebSocketServerProtocolHandler("/ws"));
pipeline.addLast(new TextWebSocketFrameHandler(group));
}
}
private void offlines(ChannelHandlerContext ctx) {
Channel channel = ctx.channel();
String token = channel.attr(ChatConstants.CHANNEL_TOKEN_KEY).get();
UserInfo info = ChatConstants.onlines.get(token);
if(info == null) {
group.remove(channel);
ctx.close();
return;
}
ChatMessage message = new ChatMessage(info, "["+info.getCode()+"], 下线了.", ChatMessage.OFF);
group.writeAndFlush(new TextWebSocketFrame(JSON.toJSONString(message)));
ChatConstants.removeOnlines(token);
group.remove(channel);
ctx.close();
}
Prerequisites
- Java 8
- Maven > 3.0
From terminal
Go on the project's root folder, then type:
$ mvn spring-boot:run
项目完整路径:spring-boot-netty