70 lines
2.4 KiB
Java
70 lines
2.4 KiB
Java
package com.guwan.backend.netty.chat;
|
||
|
||
import io.netty.bootstrap.ServerBootstrap;
|
||
import io.netty.channel.ChannelFuture;
|
||
import io.netty.channel.ChannelInitializer;
|
||
import io.netty.channel.EventLoopGroup;
|
||
import io.netty.channel.nio.NioEventLoopGroup;
|
||
import io.netty.channel.socket.SocketChannel;
|
||
import io.netty.channel.socket.nio.NioServerSocketChannel;
|
||
import io.netty.handler.codec.http.HttpObjectAggregator;
|
||
import io.netty.handler.codec.http.HttpServerCodec;
|
||
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
|
||
import lombok.RequiredArgsConstructor;
|
||
import lombok.extern.slf4j.Slf4j;
|
||
import org.springframework.beans.factory.annotation.Value;
|
||
import org.springframework.stereotype.Component;
|
||
|
||
import javax.annotation.PostConstruct;
|
||
import javax.annotation.PreDestroy;
|
||
|
||
@Slf4j
|
||
@Component
|
||
@RequiredArgsConstructor
|
||
public class ChatServer {
|
||
|
||
@Value("${netty.chat.port}")
|
||
private int port;
|
||
|
||
private final ChatServerHandler chatServerHandler;
|
||
private EventLoopGroup bossGroup;
|
||
private EventLoopGroup workerGroup;
|
||
|
||
@PostConstruct
|
||
public void start() throws Exception {
|
||
bossGroup = new NioEventLoopGroup(1);
|
||
workerGroup = new NioEventLoopGroup();
|
||
|
||
try {
|
||
ServerBootstrap bootstrap = new ServerBootstrap()
|
||
.group(bossGroup, workerGroup)
|
||
.channel(NioServerSocketChannel.class)
|
||
.childHandler(new ChannelInitializer<SocketChannel>() {
|
||
@Override
|
||
protected void initChannel(SocketChannel ch) {
|
||
ch.pipeline()
|
||
.addLast(new HttpServerCodec())
|
||
.addLast(new HttpObjectAggregator(65536))
|
||
.addLast(new WebSocketServerProtocolHandler("/ws/chat"))
|
||
.addLast(chatServerHandler);
|
||
}
|
||
});
|
||
|
||
ChannelFuture future = bootstrap.bind(port).sync();
|
||
log.info("聊天服务器启动成功,WebSocket端口: {}", port);
|
||
} catch (Exception e) {
|
||
log.error("聊天服务器启动失败", e);
|
||
throw e;
|
||
}
|
||
}
|
||
|
||
@PreDestroy
|
||
public void stop() {
|
||
if (bossGroup != null) {
|
||
bossGroup.shutdownGracefully();
|
||
}
|
||
if (workerGroup != null) {
|
||
workerGroup.shutdownGracefully();
|
||
}
|
||
}
|
||
} |