Demo netty 2
This commit is contained in:
parent
100656c611
commit
63c5024bea
@ -1,6 +1,7 @@
|
||||
package com.example.demo;
|
||||
|
||||
import com.example.demo.Entity.Person;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
@ -9,13 +10,12 @@ import org.springframework.scheduling.annotation.EnableScheduling;
|
||||
@SpringBootApplication
|
||||
@EnableScheduling //开启定时任务
|
||||
public class DemoApplication {
|
||||
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
ConfigurableApplicationContext run = SpringApplication.run(DemoApplication.class, args);
|
||||
System.out.println(run.getBeanDefinitionCount());
|
||||
|
||||
System.out.println();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
64
src/main/java/com/example/demo/Service/WebSocketServer.java
Normal file
64
src/main/java/com/example/demo/Service/WebSocketServer.java
Normal file
@ -0,0 +1,64 @@
|
||||
package com.example.demo.Service;
|
||||
|
||||
import io.netty.bootstrap.ServerBootstrap;
|
||||
import io.netty.channel.ChannelFuture;
|
||||
import io.netty.channel.ChannelInitializer;
|
||||
import io.netty.channel.ChannelOption;
|
||||
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 io.netty.handler.stream.ChunkedWriteHandler;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
|
||||
@Component
|
||||
public class WebSocketServer {
|
||||
|
||||
@Value("${netty.port}")
|
||||
private int port;
|
||||
|
||||
private final WebSocketServerHandler webSocketServerHandler;
|
||||
|
||||
public WebSocketServer(WebSocketServerHandler webSocketServerHandler) {
|
||||
this.webSocketServerHandler = webSocketServerHandler;
|
||||
}
|
||||
|
||||
@PostConstruct
|
||||
public void start() {
|
||||
EventLoopGroup bossGroup = new NioEventLoopGroup();
|
||||
EventLoopGroup workerGroup = new NioEventLoopGroup();
|
||||
try {
|
||||
ServerBootstrap serverBootstrap = new ServerBootstrap();
|
||||
serverBootstrap.group(bossGroup, workerGroup)
|
||||
.channel(NioServerSocketChannel.class)
|
||||
.childHandler(new ChannelInitializer<SocketChannel>() {
|
||||
@Override
|
||||
protected void initChannel(SocketChannel ch) {
|
||||
ch.pipeline().addLast(new HttpServerCodec());
|
||||
ch.pipeline().addLast(new ChunkedWriteHandler());
|
||||
ch.pipeline().addLast(new HttpObjectAggregator(8192));
|
||||
// WebSocket协议处理器
|
||||
ch.pipeline().addLast(new WebSocketServerProtocolHandler("/ws"));
|
||||
ch.pipeline().addLast(new WebSocketServerHandler());
|
||||
}
|
||||
})
|
||||
.option(ChannelOption.SO_BACKLOG, 128)
|
||||
.childOption(ChannelOption.SO_KEEPALIVE, true);
|
||||
|
||||
ChannelFuture channelFuture = serverBootstrap.bind(port).sync();
|
||||
System.out.println("WebSocket Server started on port: " + port);
|
||||
channelFuture.channel().closeFuture().sync();
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
bossGroup.shutdownGracefully();
|
||||
workerGroup.shutdownGracefully();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,48 @@
|
||||
package com.example.demo.Service;
|
||||
|
||||
import io.netty.channel.ChannelHandlerContext;
|
||||
import io.netty.channel.SimpleChannelInboundHandler;
|
||||
import io.netty.channel.group.ChannelGroup;
|
||||
import io.netty.channel.group.DefaultChannelGroup;
|
||||
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
|
||||
import io.netty.handler.codec.http.websocketx.WebSocketServerHandshaker;
|
||||
import io.netty.util.concurrent.GlobalEventExecutor;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
public class WebSocketServerHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {
|
||||
|
||||
// 管理所有连接的WebSocket通道
|
||||
private static final ChannelGroup channels = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
|
||||
|
||||
private WebSocketServerHandshaker webSocketServerHandshaker;
|
||||
@Override
|
||||
public void handlerAdded(ChannelHandlerContext ctx) {
|
||||
channels.add(ctx.channel());
|
||||
channels.writeAndFlush(new TextWebSocketFrame("[客户端] - " + ctx.channel().remoteAddress() + " 加入聊天室"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handlerRemoved(ChannelHandlerContext ctx) {
|
||||
channels.remove(ctx.channel());
|
||||
channels.writeAndFlush(new TextWebSocketFrame("[客户端] - " + ctx.channel().remoteAddress() + " 离开聊天室"));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) {
|
||||
// 广播消息到所有客户端
|
||||
channels.forEach(ch -> {
|
||||
if (ch != ctx.channel()) {
|
||||
ch.writeAndFlush(new TextWebSocketFrame("[客户端] " + ctx.channel().remoteAddress() + " 说:" + msg.text()));
|
||||
} else {
|
||||
ch.writeAndFlush(new TextWebSocketFrame("[你] 说:" + msg.text()));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
|
||||
cause.printStackTrace();
|
||||
ctx.close();
|
||||
}
|
||||
}
|
||||
@ -14,3 +14,5 @@ spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
|
||||
|
||||
#??mapper xml???
|
||||
mybatis-plus.mapper-locations=classpath:mappers/*.xml
|
||||
|
||||
netty.port=8080
|
||||
|
||||
Loading…
Reference in New Issue
Block a user