中文文档 (chinesische Dokumente)
Netty-Websocket-Spring-Boot-Starter hilft Ihnen bei der Entwicklung von WebSocket-Server, indem Sie Netty im Spring-Boot verwenden. Es ist einfach zu entwickeln, indem Sie Annotation wie Spring-Websocket verwenden
< dependency >
< groupId >org.yeauty</ groupId >
< artifactId >netty-websocket-spring-boot-starter</ artifactId >
< version >0.12.0</ version >
</ dependency >@ServerEndpoint in der Endpoint -Klasse , und kommentieren @BeforeHandshake , @OnOpen , @OnClose , @OnError , @OnMessage , @OnBinary , @OnEvent in der Methode. z.B @ 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 zu verbindenDeklarieren
ServerEndpointExporterin der Spring -Konfiguration werden Sie nach WebSocket -Endpunkten scannen, die mitServerEndpointkommentiert werden. Bohnen, die mitServerEndpointmit Anmerkungen versehen sind, werden als WebSocket -Endpunkt registriert. Alle Konfigurationen befinden sich in dieser Annotation (z. B.@ServerEndpoint("/ws"))
Wenn eine Verbindung akzeptiert wird, wird die mit
@BeforeHandshakekommentierte Methode aufgerufen
Klassen, die der Methode injiziert werden, sind: Sitzung, httpheaders ...
Wenn eine WebSocket -Verbindung abgeschlossen ist, wird die mit
@OnOpenkommentierte Methode aufgerufen
Klassen, die der Methode injiziert werden, sind: Sitzung, httpheaders ...
Wenn eine WebSocket -Verbindung geschlossen wird, wird die mit
@OnClosekommentierte Methode als Klassen bezeichnet, die der Methode injiziert werden, die Sitzung: Sitzung
Wenn ein WebSocket -Verbindungsverbindung Throwable throwable, wird die mit
@OnErrorkommunische Methode als Klassen bezeichnet, die der Methode injiziert werden: Sitzung, Throwable
Wenn eine WebSocket -Verbindung eine Nachricht erhielt, wird die mit
@OnMessagekommetierte Methode als Klassen bezeichnet, die der Methode injiziert werden. Session, String, String, String
Wenn eine Websocket -Verbindung die Binärdie empfangen hat, wird die mit
@OnBinarykommetierte Methode als Klassen bezeichnet, die der Methode injiziert werden, Session, Byte []
Wenn eine WebSocket -Verbindung das Ereignis von Netty erhielt, wird die mit
@OnEventkommetierte Methode als Klassen bezeichnet, die der Methode injiziert werden, die Sitzung, Session, Objekt
Alle Konfigurationen sind in der Eigenschaft von
@ServerEndpointkonfiguriert
| Eigentum | Standard | Beschreibung |
|---|---|---|
| Weg | "/" | Der Pfad des Websocket kann für value aliaisiert werden |
| Gastgeber | "0.0.0.0" | Gastgeber von Websocket. "0.0.0.0" bedeutet alle lokalen Adressen |
| Hafen | 80 | Port of WebSocket。 Wenn der Port 0 entspricht, wird er einen zufälligen und verfügbaren Port verwendet (um den Port-Multi-Endpunkt zu erhalten) |
| bosloopgroupthreads | 0 | Anzahl der Fäden in Bosseventloopgroup |
| WorkerLoopGroupThreads | 0 | Anzahl der Threads in der Arbeiterableitungsgruppe |
| UseCompressionHandler | FALSCH | Egal, ob Sie WebSocketServerCompressionHandler zu Pipeline hinzufügen |
| OptionConnectTimeOutmillis | 30000 | Das Gleiche wie bei ChannelOption.CONNECT_TIMEOUT_MILLIS in Netty |
| OptionsObacklog | 128 | Das gleiche wie bei ChannelOption.SO_BACKLOG in Netty |
| ChildoptionWritespincount | 16 | Das Gleiche wie bei ChannelOption.WRITE_SPIN_COUNT in Netty |
| ChildoptionWriteBufferHighwatermark | 64*1024 | Das Gleiche wie bei ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK in Netty, aber verwenden Sie ChannelOption.WRITE_BUFFER_WATER_MARK in der Tat. |
| ChildoptionWriteBufferlowwatermark | 32*1024 | Das Gleiche wie bei ChannelOption.WRITE_BUFFER_LOW_WATER_MARK in Netty, aber verwenden Sie ChannelOption.WRITE_BUFFER_WATER_MARK in der Tat. |
| ChildoptionsOrcvbuf | -1 (Mittelwert nicht gesetzt) | Das gleiche wie bei ChannelOption.SO_RCVBUF in Netty |
| ChildoptionsOsndbuf | -1 (Mittelwert nicht gesetzt) | Das gleiche wie bei ChannelOption.SO_SNDBUF in Netty |
| ChildoptionTCpnodelay | WAHR | Das gleiche wie bei ChannelOption.TCP_NODELAY in Netty |
| ChildoptionSokeepalive | FALSCH | Das gleiche wie ChannelOption.SO_KEEPALIVE in Netty |
| Childoptionsolinger | -1 | Das gleiche wie bei ChannelOption.SO_LINGER in Netty |
| ChildoptionallowHalfclosure | FALSCH | Das Gleiche wie bei ChannelOption.ALLOW_HALF_CLOSURE in Netty |
| Readeridletimesseconds | 0 | Das Gleiche wie readerIdleTimeSeconds in IdleStateHandler und fügen Sie IdleStateHandler zu pipeline , wenn es nicht 0 ist |
| writerIdletimeseconds | 0 | Das gleiche wie writerIdleTimeSeconds in IdleStateHandler und fügen Sie IdleStateHandler zu pipeline , wenn es nicht 0 ist |
| AllidletimeSeconds | 0 | Das Gleiche wie allIdleTimeSeconds in IdleStateHandler und fügen Sie IdleStateHandler zu pipeline , wenn es nicht 0 ist |
| MaxFramePayLoadLength | 65536 | Maximal zulässige Frame -Nutzlastlänge. |
| UseEventExecutorGroup | WAHR | Ob Sie einen anderen Thread-Pool verwenden, um zeitaufwändige synchrone Geschäftslogik durchzuführen |
| EventExecutorGroupThreads | 16 | Anzahl der Fäden in Bosseventloopgroup |
| SSLKEYPASSWORD | "" (Mittel nicht gesetzt) | Das Gleiche wie server.ssl.key-password im Spring-Boot |
| sslkeyStore | "" (Mittel nicht gesetzt) | Das gleiche wie server.ssl.key-store im Spring-Boot |
| sslkeyStorePassword | "" (Mittel nicht gesetzt) | Das gleiche wie server.ssl.key-store-password im Spring-Boot |
| sslkeyStoretype | "" (Mittel nicht gesetzt) | Das gleiche wie server.ssl.key-store-type im Spring-Boot |
| sslTruststore | "" (Mittel nicht gesetzt) | Das gleiche wie server.ssl.trust-store im Spring-Boot |
| SSLTrustStorePassword | "" (Mittel nicht gesetzt) | Das gleiche wie server.ssl.trust-store-password im Spring-Boot |
| sslTruststoretype | "" (Mittel nicht gesetzt) | Das gleiche wie server.ssl.trust-store-type im Spring-Boot |
| Korsorigines | {} (Mittelwert nicht gesetzt) | Das Gleiche wie @CrossOrigin#origins im Spring-Boot |
| Korsallowcredentials | "" (Mittel nicht gesetzt) | Das gleiche wie @CrossOrigin#allowCredentials im Spring-Boot |
Sie können die Konfiguration von
application.propertiesmit${...}Platzhaltern erhalten. Zum Beispiel:
${...} in @ServerEndpoint @ ServerEndpoint ( host = "${ws.host}" , port = "${ws.port}" )
public class MyWebSocket {
...
}application.properties ws.host=0.0.0.0
ws.port=80
Die Art und Weise, Favicon zu konfigurieren, ist der gleiche wie Spring-Boot. Wenn favicon.ico im Wurzel des Klassenpfads angezeigt wird, wird es automatisch als Favicon der Anwendung verwendet. Das Beispiel folgt:
src/
+- main/
+- java/
| + <source code>
+- resources/
+- favicon.ico
Die Art der Konfiguration von Favicon ist der gleiche wie Spring-Boot /public/error
src/
+- main/
+- java/
| + <source code>
+- resources/
+- public/
+- error/
| +- 404.html
| +- 5xx.html
+- <other public assets>
@ServerEndpoint und @Component in Klassen, die hoffen, ein Endpunkt zu werden.ServerEndpointExporter.getInetSocketAddressSet() abrufen.ServerBootstrap -Instanz.ServerBootstrap -Instanz.@PathVariable@RequestParam von der AbfrageParameterMap anstelle von @RequestParam MultiValueMap@BeforeHandshake Annotation hinzu. Sie können die Verbindung vor dem Handschlag schließen@BeforeHandshake -Event fest@Component in der Endpoint -KlasseNetty -Version auf 4.1.44.Final @RequestParam MultiValueMap verwendet wurde, um Wert zu erhaltenNetty -Version auf 4.1.45.Final ServerEndpointExporter Manully konfigurieren können @BeforeHandshake gibt, wird NullPointerexception angezeigt @BeforeHandshake gibt, ist Session in OnOpen null Throwable in OnError -Event ist null bossLoopGroupThreads auf 1useEventExecutorGroup so, dass die Synchron- und zeitaufwändige Geschäftslogik in der EventExecutorGroup ausgeführt wird, damit der E/A-Thread nicht durch eine zeitaufwändige Aufgabe blockiert wirdNetty -Version auf 4.1.49.Final ServerEndpoint -Klasse von CGGLIB (wie bei AOP -Verbesserung) verfolgt wird, funktioniert sie immer noch @enableWebSocket fügt das Attribut scanBasePackages hinzu@serverEndpoint hängt nicht mehr von @Component abNetty -Version auf 4.1.67.Final