中文文档 (китайские документы)
Netty-Websocketcocket-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 в классе Endpoint , и аннотируйте @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в конфигурации пружины, он будет сканировать на конечные точки WebSocket, которые будут аннотированы сServerEndpoint. Бобы, которые будут аннотированы с помощьюServerEndpoint, будут зарегистрированы в качестве конечной точки WebSocket. Все конфигурации находятся внутри этой аннотации (например,@ServerEndpoint("/ws"))
Когда будет принято соединение, метод, аннотированный с
@BeforeHandshake, будет вызван
Классы, которые вводим метод: сеанс, httpheaders ...
При завершении подключения к веб -покету метод, аннотированный с
@OnOpenбудет вызван
Классы, которые вводим метод: сеанс, httpheaders ...
Когда соединение WebSocket закрывается, метод, аннотированный с
@OnCloseбудет называться классами, которые могут быть введены в метод: сеанс
При броске подключения к WebSocket метод, аннотированный с
@OnError, будет называться классами, которые могут быть введены в метод: сеанс, бросаемый
Когда подключение к WebSocket получило сообщение, метод, аннотированный с
@OnMessageбудет называться классами, которые могут быть введены в метод: сеанс, строка
Когда подключение к WebSocket получило двоичный файл, метод, аннотированный с
@OnBinaryбудет называться классами, которые вводят в метод: Session, Byte []
Когда соединение WebSocket получило событие Netty, метод, аннотированный с помощью
@OnEventбудет называться классами, которые могут быть введены в метод: Session, Object
Все конфигурации настроены в свойстве
@ServerEndpoint
| свойство | по умолчанию | описание |
|---|---|---|
| путь | "/" | Путь websocket может быть псевдонимом для value |
| хозяин | "0,0,0,0" | Хозяин WebSocket. "0.0.0.0" означает все местные адреса |
| порт | 80 | Порт websocket。if, если порт равно 0 , будет использовать случайный и доступный порт (для получения порта многопользовательской точки) |
| Bossloopgroupthreads | 0 | количество потоков в Bosseventloopgroup |
| Workerloopgroupthreads | 0 | количество потоков в orevereventloopgroup |
| UsecompressionHandler | ЛОЖЬ | Добавить ли 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 |
| Childoptionsosndbuf | -1 (среднее не установлено) | так же, как ChannelOption.SO_SNDBUF в Netty |
| Childoptiontcpnodelay | истинный | так же, как ChannelOption.TCP_NODELAY в Netty |
| Chieldoptionokeepalive | ЛОЖЬ | так же, как и ChannelOption.SO_KEEPALIVE |
| Childoptionsolinger | -1 | так же, как ChannelOption.SO_LINGER в Netty |
| Childoptionallowhalfclosure | ЛОЖЬ | То же самое, что и ChannelOption.ALLOW_HALF_CLOSURE |
| ReaderIdletimeseconds | 0 | То же самое, что и readerIdleTimeSeconds в IdleStateHandler и добавьте IdleStateHandler в pipeline , когда он не 0 |
| writeridletimeseconds | 0 | То же самое, что и writerIdleTimeSeconds в IdleStateHandler и добавить IdleStateHandler в pipeline , когда он не 0 |
| Allidletimeseconds | 0 | Так же, как и allIdleTimeSeconds в IdleStateHandler и добавьте IdleStateHandler в pipeline , когда он не 0 |
| maxframepayloadlength | 65536 | Максимальная допустимая длина полезной нагрузки. |
| Использовать EventexeCutorGroup | истинный | Использовать ли другой пул потоков для выполнения трудоемкой синхронной бизнес-логики |
| 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 |
| корсоригины | {} (среднее не установлено) | так же, как @CrossOrigin#origins в Spring-Boot |
| Corsallocredentials | "" (означает не установлен) | так же, как @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
Способ настройки FAVICON такой же, как Spring-boot.if favicon.ico , представлен в корне отчатки, он будет автоматически использоваться в качестве изысканного приложения. Пример следующим образом:
src/
+- main/
+- java/
| + <source code>
+- resources/
+- favicon.ico
Способ настройки FAVICON такой же, как Spring-Boot. Вы можете добавить файл в папку /public/error Имя страницы ошибки должно быть точным кодом состояния или серии.
src/
+- main/
+- java/
| + <source code>
+- resources/
+- public/
+- error/
| +- 404.html
| +- 5xx.html
+- <other public assets>
@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 Manully @BeforeHandshake , NullPointerException появится @BeforeHandshake , Session в OnOpen is null Throwable в OnError Event is null bossLoopGroupThreads на 1useEventExecutorGroup для запуска синхронной и трудоемкой бизнес-логики в EventExeCutorGroup, чтобы поток ввода-вывода не заблокировался трудоемкой задачейNetty до 4.1.49.Final ServerEndpoint прокси -CGLIB (как при улучшении AOP), он все еще работает @enableWebSocket добавляет атрибут scanBasePackages@serverEndpoint больше не зависит от @ComponentNetty до 4.1.67.Final