中文文档 (docs chinois)
Netty-websocket-spring-boot-starter vous aidera à développer le serveur WebSocket en utilisant Netty dans Spring-boot, il est facile à développer en utilisant l'annotation comme Spring-WebSocket
< dependency >
< groupId >org.yeauty</ groupId >
< artifactId >netty-websocket-spring-boot-starter</ artifactId >
< version >0.12.0</ version >
</ dependency >@ServerEndpoint sur la classe EndPoint , et annoter @BeforeHandshake , @OnOpen , @OnClose , @OnError , @OnMessage , @OnBinary , @OnEvent sur la méthode. par exemple @ 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/xxxDÉCLARATIONS
ServerEndpointExporterDans la configuration de Spring, il analysera les points de terminaison WebSocket qui seront annotés avecServerEndpoint. Les haricots qui seront annotés avecServerEndpointseront enregistrés en tant que point de terminaison WebSocket. Toutes les configurations sont à l'intérieur de cette annotation (par exemple@ServerEndpoint("/ws"))
Lorsqu'une connexion est acceptée, la méthode annotée avec
@BeforeHandshakesera appelée
Les classes qui sont injectées à la méthode sont: Session, Httpheaders ...
Une fois une connexion WebSocket terminée, la méthode annotée avec
@OnOpensera appelée
Les classes qui sont injectées à la méthode sont: Session, Httpheaders ...
Lorsqu'une connexion WebSocket fermée, la méthode annotée avec
@OnClosesera appelée les classes qui seront injectées à la méthode sont: Session
Lorsqu'un jet de connexion WebSocket jetable, la méthode annotée avec
@OnErrorsera appelée des classes qui seront injectées à la méthode sont: Session, Throwable
Lorsqu'une connexion WebSocket a reçu un message, la méthode annotée avec
@OnMessagesera appelée classes qui seront injectées à la méthode: Session, String
Lorsqu'une connexion WebSocket a reçu le binaire, la méthode annotée avec
@OnBinarysera appelée des classes qui seront injectées à la méthode sont: Session, Byte []
Lorsqu'une connexion WebSocket a reçu l'événement de Netty, la méthode annotée avec
@OnEventsera appelée des classes qui seront injectées à la méthode sont: Session, objet
Toutes les configurations sont configurées dans la propriété de
@ServerEndpoint
| propriété | défaut | description |
|---|---|---|
| chemin | "/" | Le chemin de WebSocket peut être aliasé pour value |
| hôte | "0.0.0.0" | Hôte de WebSocket. "0.0.0.0" signifie toutes les adresses locales |
| port | 80 | Port de WebSocket。Si le port est égal à 0 , il utilisera un port aléatoire et disponible (pour obtenir le port multi-Endpoint) |
| BossloopgroupThreads | 0 | Num de fils dans BosseventloopGroup |
| WorkerloopGroupThreads | 0 | Num de threads dans WorkEreventloopGroup |
| UsecompressionHandler | FAUX | si ajouter WebSocketServerCompressionHandler à Pipeline |
| optionConnectTimeoutmillis | 30000 | le même que ChannelOption.CONNECT_TIMEOUT_MILLIS dans Netty |
| OptionsObacklog | 128 | le même que ChannelOption.SO_BACKLOG dans NetTy |
| childoptionwritepincount | 16 | le même que ChannelOption.WRITE_SPIN_COUNT dans netty |
| childoptionwritebufferhighwatermark | 64 * 1024 | La même chose que ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK dans Netty, mais utilisez en fait ChannelOption.WRITE_BUFFER_WATER_MARK . |
| childoptionwritebufferlowwatermark | 32 * 1024 | Le même que ChannelOption.WRITE_BUFFER_LOW_WATER_MARK dans Netty, mais utilisez en fait ChannelOption.WRITE_BUFFER_WATER_MARK . |
| childoptionsorcvbuf | -1 (signifie pas défini) | le même que ChannelOption.SO_RCVBUF dans NetTy |
| childoptionsosndbuf | -1 (signifie pas défini) | le même que ChannelOption.SO_SNDBUF dans NetTy |
| childoptiontcpnodelay | vrai | le même que ChannelOption.TCP_NODELAY dans NetTy |
| childoptiono | FAUX | la même chose que ChannelOption.SO_KEEPALIVE dans NetTy |
| Childoptions Solinger | -1 | le même que ChannelOption.SO_LINGER dans NetTy |
| childoptionallowhalfclosure | FAUX | la même chose que ChannelOption.ALLOW_HALF_CLOSURE dans Netty |
| ReaderridleTimesEcondes | 0 | Le même que readerIdleTimeSeconds dans IdleStateHandler et ajoutez IdleStateHandler au pipeline quand il n'est pas 0 |
| écrivain | 0 | Le même que writerIdleTimeSeconds dans IdleStateHandler et ajouter IdleStateHandler au pipeline quand il n'est pas 0 |
| allidleTimesEcondes | 0 | Le même que allIdleTimeSeconds dans IdleStateHandler et ajoutez IdleStateHandler à pipeline quand il n'est pas 0 |
| maxframepayloadLength | 65536 | Longueur de charge utile maximale admissible. |
| useEventExecutorGroup | vrai | Que ce soit à utiliser un autre pool de threads pour effectuer une logique commerciale synchrone qui prend du temps |
| eventExecutorGroupThreads | 16 | Num de fils dans BosseventloopGroup |
| SSLKEYPASSWORD | "" (signifie pas non réglé) | Identique à server.ssl.key-password dans Spring-boot |
| sslkeystore | "" (signifie pas non réglé) | le même que server.ssl.key-store à Spring-boot |
| sslkeystorepassword | "" (signifie pas non réglé) | le même que server.ssl.key-store-password dans Spring-boot |
| sslkeystoreType | "" (signifie pas non réglé) | le même que server.ssl.key-store-type à Spring-boot |
| ssltruststore | "" (signifie pas non réglé) | le même que server.ssl.trust-store dans Spring-boot |
| sslTrustStorePassword | "" (signifie pas non réglé) | le même que server.ssl.trust-store-password dans Spring-boot |
| ssltruststoreType | "" (signifie pas non réglé) | le même que server.ssl.trust-store-type dans Spring-boot |
| corsorigines | {} (signifie pas défini) | Identique à @CrossOrigin#origins in printemps-boot |
| corsallowCredentials | "" (signifie pas non réglé) | Identique à @CrossOrigin#allowCredentials in printemps-boot |
Vous pouvez obtenir la configuration de
application.propertiesen utilisant${...}. Par exemple:
${...} dans @ServerEndpoint @ ServerEndpoint ( host = "${ws.host}" , port = "${ws.port}" )
public class MyWebSocket {
...
}application.properties ws.host=0.0.0.0
ws.port=80
La façon de configurer Favicon est la même que le printemps-boot.Si favicon.ico est présenté dans la racine du chemin de classe, il sera automatiquement utilisé comme Favicon de l'application. L'exemple est suivant:
src/
+- main/
+- java/
| + <source code>
+- resources/
+- favicon.ico
La façon de configurer FaviCon est la même que Spring-Boot.Vous pouvez ajouter un fichier au dossier AN /public/error
src/
+- main/
+- java/
| + <source code>
+- resources/
+- public/
+- error/
| +- 404.html
| +- 5xx.html
+- <other public assets>
@ServerEndpoint et @Component dans les classes qui espèrent devenir un point de terminaison.ServerEndpointExporter.getInetSocketAddressSet() .ServerBootstrap .ServerBootstrap .@PathVariable@RequestParam à partir de la requêteParameterMap , au lieu de @RequestParam MultiValueMap@BeforeHandshake annotation , vous pouvez fermer la connexion avant la poignée de main@BeforeHandshake@Component sur la classe EndpointNetty vers 4.1.44.Final @RequestParam MultiValueMap pour obtenir de la valeurNetty vers 4.1.45.Final ServerEndpointExporter Manully @BeforeHandshake , NullPointerException apparaîtra @BeforeHandshake , Session dans OnOpen est nul Throwable dans l'événement OnError est nul bossLoopGroupThreads à 1useEventExecutorGroup pour exécuter une logique commerciale synchrone et chronophage dans EventExecutorGroup, afin que le thread d'E / S ne soit pas bloqué par une tâche qui prend du tempsNetty vers 4.1.49.Final ServerEndpoint est proxie par CGLIB (comme avec AOP Amélioration), cela fonctionne toujours @enableWebSocket ajoute l'attribut scanBasePackages@serverEndpoint ne dépend plus de @ComponentNetty vers 4.1.67.Final