中文文档 (documentos chinos)
Netty-Websocket-Spring-Boot Starter lo ayudará a desarrollar el servidor WebSocket usando Netty en Spring-Boot, es fácil de desarrollar utilizando anotaciones como Spring-WebSocket
< dependency >
< groupId >org.yeauty</ groupId >
< artifactId >netty-websocket-spring-boot-starter</ artifactId >
< version >0.12.0</ version >
</ dependency >@ServerEndpoint en la clase de punto final, y anotar @BeforeHandshake , @OnOpen , @OnClose , @OnError , @OnMessage , @OnBinary , @OnEvent en el método. p.ej @ 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/xxxDeclarando
ServerEndpointExporteren la configuración de Spring, escaneará los puntos finales de WebSocket que se anotan conServerEndpoint. Los frijoles que se anotan conServerEndpointse registrarán como un punto final WebSocket. Todas las configuraciones están dentro de esta anotación (por ejemplo,@ServerEndpoint("/ws"))
Cuando se acepta una conexión, se llamará al método anotado con
@BeforeHandshake
Las clases que se inyectan al método son: sesión, httpheaders ...
Cuando hay una conexión de WebSocket completada, se llamará al método anotado con
@OnOpen
Las clases que se inyectan al método son: sesión, httpheaders ...
Cuando se cerró una conexión WebSocket, el método anotado con
@OnClosese llamará clases que se inyectan al método son: Sesión
Cuando un lanzamiento de conexión de WebSocket se puede lanzar, el método anotado con
@OnErrorse llamará clases que se inyectan al método son: sesión, lanzamiento de
Cuando una conexión WebSocket recibió un mensaje, el método anotado con
@OnMessagese llamará clases que se inyectan al método son: sesión, cadena
Cuando una conexión WebSocket recibió el binario, el método anotado con
@OnBinaryse llamará clases que se inyectan al método son: sesión, byte []
Cuando una conexión WebSocket recibió el evento de Netty, el método anotado con
@OnEventse llamará clases que se inyectan al método son: sesión, objeto
Todas las configuraciones están configuradas en la propiedad de
@ServerEndpoint
| propiedad | por defecto | descripción |
|---|---|---|
| camino | "/" | la ruta de WebSocket puede ser alias para value |
| anfitrión | "0.0.0.0" | Anfitrión de WebSocket. "0.0.0.0" significa todas las direcciones locales |
| puerto | 80 | Puerto de WebSocket。 Si el puerto es igual a 0, utilizará un puerto aleatorio y disponible (para obtener el puerto multi-endPoint) |
| bossloopgroupthreads | 0 | Número de hilos en BosseventloopGroup |
| WorkerloopGroupThreads | 0 | Número de hilos en WorkerEventLoopGroup |
| usecompressionHandler | FALSO | Si agrega WebSocketServerCompressionHandler a la tubería |
| OptionConnectTimeOutmillis | 30000 | Lo mismo que ChannelOption.CONNECT_TIMEOUT_MILLIS en Netty |
| optionsobacklog | 128 | Lo mismo que ChannelOption.SO_BACKLOG en Netty |
| ChildOptionWriteSpinDount | 16 | Lo mismo que ChannelOption.WRITE_SPIN_COUNT en Netty |
| ChildOptionWriteBufferHighwatermark | 64*1024 | Lo mismo que ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK en Netty, pero usa ChannelOption.WRITE_BUFFER_WATER_MARK de hecho. |
| ChildOptionWriteBufferlowwatermark | 32*1024 | Lo mismo que ChannelOption.WRITE_BUFFER_LOW_WATER_MARK en Netty, pero usa ChannelOption.WRITE_BUFFER_WATER_MARK de hecho. |
| ChildOptionsORCVBUF | -1 (significa no establecido) | Lo mismo que ChannelOption.SO_RCVBUF en Netty |
| ChildOptionsOsndBuf | -1 (significa no establecido) | lo mismo que ChannelOption.SO_SNDBUF en Netty |
| ChildOptionTcpnodelay | verdadero | Lo mismo que ChannelOption.TCP_NODELAY en Netty |
| ChildoptionsokePalive | FALSO | Lo mismo que ChannelOption.SO_KEEPALIVE en Netty |
| Childoptionsolinger | -1 | lo mismo que ChannelOption.SO_LINGER en Netty |
| ChildOptionAllowhalfClosure | FALSO | Lo mismo que ChannelOption.ALLOW_HALF_CLOSURE en Netty |
| ReaderidletimesConds | 0 | Lo mismo que readerIdleTimeSeconds en IdleStateHandler y agregue IdleStateHandler a pipeline cuando no es 0 |
| WriteridletimesConds | 0 | Lo mismo que writerIdleTimeSeconds en IdleStateHandler y agregar IdleStateHandler a pipeline cuando no es 0 |
| AllidletimesConds | 0 | Lo mismo que allIdleTimeSeconds en IdleStateHandler y agregue IdleStateHandler a pipeline cuando no es 0 |
| MaxframePayLoadLength | 65536 | Longitud máxima de carga útil del marco permitido. |
| UseEventExecutorGroup | verdadero | Si usar otro grupo de hilos para realizar una lógica comercial síncrona que consumen mucho tiempo |
| EventExecutorGroupThreads | 16 | Número de hilos en BosseventloopGroup |
| sslkypassword | "" (significa no establecido) | lo mismo que server.ssl.key-password en spring-boot |
| sslkeystore | "" (significa no establecido) | lo mismo que server.ssl.key-store en boot spring |
| sslkeystorePassword | "" (significa no establecido) | Lo mismo que server.ssl.key-store-password en Spring-Boot |
| sslkeyStoreType | "" (significa no establecido) | Lo mismo que server.ssl.key-store-type en boot de primavera |
| ssltruststore | "" (significa no establecido) | lo mismo que server.ssl.trust-store en boot spring |
| ssltruststorePassword | "" (significa no establecido) | Lo mismo que server.ssl.trust-store-password en boot spring |
| ssltrustStoreType | "" (significa no establecido) | lo mismo que server.ssl.trust-store-type en spring-boot |
| corsorigen | {} (significa no establecido) | Lo mismo que @CrossOrigin#origins en Boot Spring |
| Corsallowcredentials | "" (significa no establecido) | Lo mismo que @CrossOrigin#allowCredentials en Boot Spring |
Puede obtener el Configuración de
application.propertiesutilizando${...}de poseedores de posición. Por ejemplo:
${...} en @ServerEndpoint @ ServerEndpoint ( host = "${ws.host}" , port = "${ws.port}" )
public class MyWebSocket {
...
}application.properties ws.host=0.0.0.0
ws.port=80
La forma de configurar favicon es la misma que Spring-Boot. Si favicon.ico se presenta en la raíz de ClassPath, se utilizará automáticamente como el favicón de la aplicación. El ejemplo lo sigue:
src/
+- main/
+- java/
| + <source code>
+- resources/
+- favicon.ico
La forma de configurar favicon es la misma que Spring-Boot. Puede agregar un archivo a una carpeta /public/error El nombre de la página de error debe ser el código de estado exacto o una máscara de serie. El ejemplo es el siguiente:
src/
+- main/
+- java/
| + <source code>
+- resources/
+- public/
+- error/
| +- 404.html
| +- 5xx.html
+- <other public assets>
@ServerEndpoint y @Component en clases que esperan convertirse en un punto final.ServerEndpointExporter.getInetSocketAddressSet() .ServerBootstrap .ServerBootstrap .@PathVariable@RequestParam de QueryParameterMap , en lugar de @RequestParam MultiValueMap@BeforeHandshake , puede cerrar la conexión antes del apretón de manos@BeforeHandshake@Component en EndpointNetty a 4.1.44.Final @RequestParam MultiValueMap para obtener valorNetty a 4.1.45.Final ServerEndpointExporter Manully @BeforeHandshake , aparecerá nullpointerException @BeforeHandshake , Session en OnOpen es nula Throwable en el evento OnError es nulo bossLoopGroupThreads a 1useEventExecutorGroup para ejecutar la lógica comercial sincrónica y que consumen mucho tiempo en EventExecutorGroup, de modo que el hilo de E/S no está bloqueado por una tarea que consumen mucho tiempoNetty a 4.1.49.Final ServerEndpoint está representada por CGLIB (como con la mejora de AOP), todavía funciona @enableWebSocket agrega el atributo scanBasePackages@serverEndpoint ya no depende de @ComponentNetty a 4.1.67.Final