Skip to content

Commit e61583a

Browse files
优化代码,合并WebsocketServer类代码到ServerEndpointExporter类
1 parent ce7be5a commit e61583a

File tree

5 files changed

+81
-116
lines changed

5 files changed

+81
-116
lines changed

README_zh.md

+2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ netty-websocket-http-spring-boot-starter [![License](http://img.shields.io/:lice
66
### 简介
77
本项目帮助你在spring-boot中使用Netty来开发WebSocket服务器,并像spring-websocket的注解开发一样简单,还可以帮助你在spring-boot中使用Netty来开发简单的Http服务器
88

9+
项目启动及其迅捷,经测试启动时间在1s左右。
10+
911
WebSocket和Http使用统一端口(默认8080),方便网络方面的管理,另外本项目可用作微服务,只需添加注册发现相关依赖即可
1012

1113
### 要求

demo/src/main/java/org/pyj/demo/WebSocket.java

+1
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,6 @@ public void onError(Session session, Throwable throwable) {
3333

3434
@OnMessage
3535
public void OnMessage(Session session, String message) {
36+
System.out.println(message);
3637
}
3738
}

src/main/java/org/pyj/ServerEndpointExporter.java

+78-18
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,43 @@
11
package org.pyj;
22

3-
import org.pyj.http.annotation.NettyHttpHandler;
3+
import io.netty.bootstrap.ServerBootstrap;
4+
import io.netty.channel.ChannelFuture;
5+
import io.netty.channel.ChannelInitializer;
6+
import io.netty.channel.ChannelOption;
7+
import io.netty.channel.ChannelPipeline;
8+
import io.netty.channel.EventLoopGroup;
9+
import io.netty.channel.WriteBufferWaterMark;
10+
import io.netty.channel.nio.NioEventLoopGroup;
11+
import io.netty.channel.socket.nio.NioServerSocketChannel;
12+
import io.netty.channel.socket.nio.NioSocketChannel;
13+
import io.netty.handler.codec.http.HttpObjectAggregator;
14+
import io.netty.handler.codec.http.HttpServerCodec;
15+
import io.netty.handler.logging.LogLevel;
16+
import io.netty.handler.logging.LoggingHandler;
17+
import java.net.InetAddress;
18+
import java.net.InetSocketAddress;
19+
import java.net.UnknownHostException;
20+
import java.util.HashMap;
21+
import java.util.Map;
22+
import lombok.extern.slf4j.Slf4j;
423
import org.pyj.exception.IllegalPathDuplicatedException;
24+
import org.pyj.http.annotation.NettyHttpHandler;
525
import org.pyj.http.handler.IFunctionHandler;
626
import org.pyj.http.path.Path;
7-
import lombok.extern.slf4j.Slf4j;
827
import org.springframework.beans.TypeConverter;
928
import org.springframework.beans.TypeMismatchException;
1029
import org.springframework.beans.factory.BeanFactory;
11-
import org.springframework.beans.factory.annotation.Autowired;
1230
import org.springframework.beans.factory.config.BeanExpressionContext;
1331
import org.springframework.beans.factory.config.BeanExpressionResolver;
1432
import org.springframework.beans.factory.support.AbstractBeanFactory;
1533
import org.springframework.context.ApplicationContext;
1634
import org.springframework.core.annotation.AnnotatedElementUtils;
17-
import org.springframework.core.env.Environment;
1835
import org.yeauty.annotation.ServerEndpoint;
1936
import org.yeauty.exception.DeploymentException;
2037
import org.yeauty.pojo.PojoEndpointServer;
2138
import org.yeauty.pojo.PojoMethodMapping;
2239
import org.yeauty.standard.ServerEndpointConfig;
2340

24-
import java.util.HashMap;
25-
import java.util.Map;
26-
2741
/**
2842
* @author pengyongjian
2943
* @Description:
@@ -32,14 +46,8 @@
3246
@Slf4j
3347
public class ServerEndpointExporter extends org.yeauty.standard.ServerEndpointExporter {
3448

35-
@Autowired
36-
Environment environment;
37-
3849
private AbstractBeanFactory beanFactory;
3950

40-
@Autowired
41-
private WebsocketServer websocketServer;
42-
4351
@Override
4452
public void afterSingletonsInstantiated() {
4553
registerEndpoint();
@@ -89,15 +97,67 @@ private void registerEndpoint() {
8997
// 创建http处理业务类对象
9098
HttpServerHandler httpServerHandler = new HttpServerHandler(pojoEndpointServer, serverEndpointConfig,
9199
functionHandlerMap, webSocketServerHandler);
92-
// 将http处理业务类对象注入到netty的web容器中
93-
websocketServer.setHttpServerHandler(httpServerHandler);
94100
// netty的web容器的启动
95-
init(serverEndpointConfig.getPort());
101+
init(serverEndpointConfig.getPort(), httpServerHandler);
96102
}
97103

98-
private void init(int port) {
104+
private void init(int port, HttpServerHandler httpServerHandler) {
99105
try {
100-
websocketServer.init();
106+
ServerEndpointConfig config = httpServerHandler.getConfig();
107+
EventLoopGroup boss = new NioEventLoopGroup(config.getBossLoopGroupThreads());
108+
EventLoopGroup worker = new NioEventLoopGroup(config.getWorkerLoopGroupThreads());
109+
ServerBootstrap bootstrap = new ServerBootstrap();
110+
bootstrap.group(boss, worker)
111+
.channel(NioServerSocketChannel.class)
112+
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, config.getConnectTimeoutMillis())
113+
.option(ChannelOption.SO_BACKLOG, config.getSoBacklog())
114+
.childOption(ChannelOption.WRITE_SPIN_COUNT, config.getWriteSpinCount())
115+
.childOption(ChannelOption.WRITE_BUFFER_WATER_MARK, new WriteBufferWaterMark(config.getWriteBufferLowWaterMark(), config.getWriteBufferHighWaterMark()))
116+
.childOption(ChannelOption.TCP_NODELAY, config.isTcpNodelay())
117+
.childOption(ChannelOption.SO_KEEPALIVE, config.isSoKeepalive())
118+
.childOption(ChannelOption.SO_LINGER, config.getSoLinger())
119+
.childOption(ChannelOption.ALLOW_HALF_CLOSURE, config.isAllowHalfClosure())
120+
.handler(new LoggingHandler(LogLevel.DEBUG))
121+
.childHandler(new ChannelInitializer<NioSocketChannel>() {
122+
@Override
123+
protected void initChannel(NioSocketChannel ch) throws Exception {
124+
ChannelPipeline pipeline = ch.pipeline();
125+
pipeline.addLast(new HttpServerCodec());
126+
pipeline.addLast(new HttpObjectAggregator(65536));
127+
pipeline.addLast(httpServerHandler);
128+
}
129+
});
130+
131+
if (config.getSoRcvbuf() != -1) {
132+
bootstrap.childOption(ChannelOption.SO_RCVBUF, config.getSoRcvbuf());
133+
}
134+
135+
if (config.getSoSndbuf() != -1) {
136+
bootstrap.childOption(ChannelOption.SO_SNDBUF, config.getSoSndbuf());
137+
}
138+
139+
ChannelFuture channelFuture;
140+
if ("0.0.0.0".equals(config.getHost())) {
141+
channelFuture = bootstrap.bind(config.getPort());
142+
} else {
143+
try {
144+
channelFuture = bootstrap.bind(new InetSocketAddress(InetAddress.getByName(config.getHost()), config.getPort()));
145+
} catch (UnknownHostException e) {
146+
channelFuture = bootstrap.bind(config.getHost(), config.getPort());
147+
e.printStackTrace();
148+
}
149+
}
150+
151+
channelFuture.addListener(future -> {
152+
if (!future.isSuccess()){
153+
future.cause().printStackTrace();
154+
}
155+
});
156+
157+
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
158+
boss.shutdownGracefully().syncUninterruptibly();
159+
worker.shutdownGracefully().syncUninterruptibly();
160+
}));
101161
logger.info("=====Netty WebSocket started on port:" + port + " =====");
102162
} catch (Exception e) {
103163
logger.error("websocket init fail", e);

src/main/java/org/pyj/WebsocketServer.java

-92
This file was deleted.

src/main/java/org/pyj/config/WebSocketNettyConfig.java

-6
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package org.pyj.config;
22

33
import org.pyj.ServerEndpointExporter;
4-
import org.pyj.WebsocketServer;
54
import org.springframework.context.annotation.Bean;
65
import org.springframework.context.annotation.Configuration;
76

@@ -16,9 +15,4 @@ public class WebSocketNettyConfig {
1615
public ServerEndpointExporter serverEndpointExporter() {
1716
return new ServerEndpointExporter();
1817
}
19-
20-
@Bean
21-
public WebsocketServer websocketServer() {
22-
return new WebsocketServer();
23-
}
2418
}

0 commit comments

Comments
 (0)