netty-websocket-spring-boot-starter
中文文档 (Chinese Docs)
netty-websocket-spring-boot-starter поможет вам разработать сервер WebSocket с использованием Netty в spring-boot. Разрабатывать легко, используя аннотации, подобные spring-websocket.
<dependency>
<groupId>org.yeauty</groupId>
<artifactId>netty-websocket-spring-boot-starter</artifactId>
<version>0.12.0</version>
</dependency>
@ServerEndpoint
на классе конечной точки и аннотируйте методы @BeforeHandshake
, @OnOpen
, @OnClose
, @OnError
, @OnMessage
, @OnBinary
, @OnEvent
. Например:@ServerEndpoint(path = "/ws/{arg}")
public class MyWebSocket {
@BeforeHandshake
public void handshake(Session session, HttpHeaders headers, @RequestParam String req, @RequestParam MultiValueMap reqMap, @PathVariable String arg, @PathVariable Map pathMap){
session.setSubprotocols("stomp");
if (!"ok".equals(req)){
System.out.println("Authentication failed!");
session.close();
}
}
@OnOpen
public void onOpen(Session session, HttpHeaders headers, @RequestParam String req, @RequestParam MultiValueMap reqMap, @PathVariable String arg, @PathVariable Map pathMap){
System.out.println("new connection");
System.out.println(req);
}
@OnClose
public void onClose(Session session) throws IOException {
System.out.println("one connection closed");
}
@OnError
public void onError(Session session, Throwable throwable) {
throwable.printStackTrace();
}
@OnMessage
public void onMessage(Session session, String message) {
System.out.println(message);
session.sendText("Hello Netty!");
}
@OnBinary
public void onBinary(Session session, byte[] bytes) {
for (byte b : bytes) {
System.out.println(b);
}
session.sendBinary(bytes);
}
@OnEvent
public void onEvent(Session session, Object evt) {
if (evt instanceof IdleStateEvent) {
IdleStateEvent idleStateEvent = (IdleStateEvent) evt;
switch (idleStateEvent.state()) {
case READER_IDLE:
System.out.println("read idle");
break;
case WRITER_IDLE:
System.out.println("write idle");
break;
case ALL_IDLE:
System.out.println("all idle");
break;
default:
break;
}
}
}
}
ws://127.0.0.1:80/ws/xxx
.Объявляет
ServerEndpointExporter
в конфигурации Spring, сканирует конечные точки WebSocket, которые аннотируются с помощью@ServerEndpoint
. Бины, аннотированные с помощью@ServerEndpoint
, регистрируются как конечная точка WebSocket. Все конфигурации находятся внутри этой аннотации (например,@ServerEndpoint("/ws")
)
Когда соединение принято, метод, аннотированный с помощью
@BeforeHandshake
, будет вызван. Классы, которые внедряются в метод: Session, HttpHeaders...
Когда подключение к WebSocket завершено, метод, аннотированный с помощью
@OnOpen
, будет вызван. Классы, которые вводятся в метод: Session, HttpHeaders...
Когда соединение WebSocket закрыто, метод, аннотированный с помощью
@OnClose
, будет вызван. Класс, который вводится в метод: Session.
Когда соединение WebSocket выбрасывает Throwable, метод, аннотированный с помощью
@OnError
, будет вызван. Классы, которые вводятся в метод: Session, Throwable.
Когда соединение WebSocket получает сообщение, вызывается метод, аннотированный с
@OnMessage
.
В этот метод будут внедрены следующие классы: Session, String.
Когда соединение WebSocket получает двоичные данные, вызывается метод, аннотированный с @OnBinary
.
В этот метод будут внедрены следующие классы: Session, byte[].
Когда соединение WebSocket получает событие Netty, вызывается метод, аннотированный с @OnEvent
.
В этот метод будут внедрены следующие классы: Session, Object.
Все конфигурации настраиваются в свойствах @ServerEndpoint
.
Свойство | По умолчанию | Описание |
---|---|---|
path | / | Путь WebSocket может быть псевдонимом для value
|
host | 0.0.0.0 | Хост WebSocket. «0.0.0.0» означает все локальные адреса |
port | 80 | Порт WebSocket. Если порт равен 0, будет использоваться случайный и доступный порт (для получения порта Multi-Endpoint) |
bossLoopGroupThreads | 0 | Количество потоков в bossEventLoopGroup |
workerLoopGroupThreads | 0 | Количество потоков в workerEventLoopGroup |
useCompressionHandler | false | Добавлять ли WebSocketServerCompressionHandler в конвейер |
optionConnectTimeoutMillis | 30000 | То же, что и ChannelOption.CONNECT_TIMEOUT_MILLIS в Netty |
optionSoBacklog | 128 | То же, что и ChannelOption.SO_BACKLOG в Netty |
childOptionWriteSpinCount | 16 | То же, что и ChannelOption.WRITE_SPIN_COUNT в Netty |
childOptionWriteBufferHighWaterMark | 64 * 1024 | То же, что и ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK в Netty, но на самом деле используется ChannelOption.WRITE_BUFFER_WATER_MARK
|
childOptionWriteBufferLowWaterMark | 32 * 1024 | То же, что и ChannelOption.WRITE_BUFFER_LOW_WATER_MARK в Netty, но на самом деле используется ChannelOption.WRITE_BUFFER_WATER_MARK
|
childOptionSoRcvbuf | -1 (означает не установлен) | То же, что и ChannelOption.SO_RCVBUF в Netty |
childOptionSoSndbuf | -1 (означает не установлен) | То же, что и ChannelOption.SO_SNDBUF в Netty |
childOptionTcpNodelay | true | То же, что и ChannelOption.TCP_NODELAY в Netty |
childOptionSoKeepalive | false | То же, что и ChannelOption.SO_KEEPALIVE в Netty |
childOptionSoLinger | -1 | То же, что и ChannelOption.SO_LINGER в Netty |
childOptionAllowHalfClosure | false | То же, что и ChannelOption.ALLOW_HALF_CLOSURE в Netty |
readerIdleTimeSeconds | 0 | То же, что и readerIdleTimeSeconds в IdleStateHandler , и добавить IdleStateHandler в pipeline , когда оно не равно 0 |
writerIdleTimeSeconds | 0 | То же, что и writerIdleTimeSeconds в IdleStateHandler , и добавить IdleStateHandler в pipeline , когда оно не равно 0 |
allIdleTimeSeconds | 0 | То же, что и allIdleTimeSeconds в IdleStateHandler , и добавить IdleStateHandler в pipeline , когда оно не равно 0 |
maxFramePayloadLength | 65536 | Максимально допустимая длина полезной нагрузки кадра |
useEventExecutorGroup | true | Использовать ли другой пул потоков для выполнения длительной синхронной бизнес-логики |
eventExecutorGroupThreads | 16 | Количество потоков в bossEventLoopGroup |
sslKeyPassword | "" (не установлено) | То же, что и server.ssl.key-password в spring-boot |
sslKeyStore | "" (не установлено) | То же, что и server.ssl.key-store в spring-boot |
sslKeyStorePassword | "" (не установлено) | То же, что и server.ssl.key-store-password в spring-boot |
sslKeyStoreType | "" (не установлено) | То же, что и server.ssl.key-store-type в spring-boot |
sslTrustStore | "" (не установлено) | То же, что и server.ssl.trust-store в spring-boot |
sslTrustStorePassword | "" (не установлено) | То же, что и server.ssl.trust-store-password в spring-boot |
sslTrustStoreType | "" (не установлено) | То же, что и server.ssl.trust-store-type в spring-boot |
corsOrigins | {} (не установлено) | То же, что и @CrossOrigin#origins в spring-boot |
corsAllowCredentials | "" (не установлено) | То же, что и @CrossOrigin#allowCredentials в spring-boot |
Можно получить конфигурацию application.properties
с помощью заполнителей ${...}
. Например:
— сначала используйте ${...}
в @ServerEndpoint
:
@ServerEndpoint(host = "${ws.host}",port = "${ws.port}")
public class MyWebSocket {
...
}
— затем настройте в application.properties
:
ws.host=0.0.0.0
ws.port=80
Настройка фавикона происходит так же, как и в spring-boot. Если файл favicon.ico
находится в корне пути к классам, он будет автоматически использоваться в качестве фавикона приложения. Пример:
src/
+- main/
+- java/
| + исходный код
+- resources/
+- favicon.ico
Пользовательские страницы ошибок
Настроить фавикон можно так же, как в spring-boot. Можно добавить файл в папку /public/error
. Имя страницы ошибки должно соответствовать точному коду состояния или маске серии. Пример:
src/
+- main/
+- java/
| + <исходный код>
+- resources/
+- public/
+- error/
| +- 404.html
| +- 5xx.html
+- другие публичные активы
Несколько конечных точек
@ServerEndpoint
и @Component
в классах, которые должны стать конечной точкой.ServerEndpointExporter.getInetSocketAddressSet()
.ServerBootstrap
.ServerBootstrap
.Журнал изменений
@PathVariable
.@RequestParam
из запроса.ParameterMap
, вместо @RequestParam MultiValueMap
.@BeforeHandshake
, вы можете закрыть соединение перед рукопожатием.@BeforeHandshake
.@Component
на классе конечной точки.Netty
до 4.1.44.Final
.@RequestParam MultiValueMap
для получения значения.Netty
до 4.1.45.Final
.ServerEndpointExporter
вручную.@BeforeHandshake
появлялось исключение NullPointerException.@BeforeHandshake
Session
в OnOpen
был равен нулю.Throwable
в событии OnError
был нулевым.bossLoopGroupThreads
на 1.useEventExecutorGroup
для запуска синхронной и ресурсоёмкой бизнес-логики в EventExecutorGroup, чтобы поток ввода-вывода не блокировался ресурсоёмкими задачами.Netty
до версии 4.1.49.Final
.ServerEndpoint
проксируется CGLIB (как при улучшении AOP), он всё ещё работает.@enableWebSocket
добавлен атрибут scanBasePackages
.@serverEndpoint
больше не зависит от @Component
.Netty
до версии 4.1.67.Final
.Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )