中文文档 (documentos chineses)
Netty-Websocket-Spring-Boot-Starter ajudará você a desenvolver o WebSocket Server usando a Netty no Spring-Boot, é fácil de desenvolver usando anotação como Spring-WebSocket
< dependency >
< groupId >org.yeauty</ groupId >
< artifactId >netty-websocket-spring-boot-starter</ artifactId >
< version >0.12.0</ version >
</ dependency >@ServerEndpoint na classe Endpoint , e anote @BeforeHandshake , @OnOpen , @OnClose , @OnError , @OnMessage , @OnBinary , @OnEvent no método. por exemplo @ 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
ServerEndpointExporterna configuração do Spring, ele digitalizará os pontos de extremidade do WebSocket que serão anotados comServerEndpoint. Os grãos que serão anotados comServerEndpointserão registrados como um ponto de extremidade do WebSocket. Todas as configurações estão dentro desta anotação (por exemplo,@ServerEndpoint("/ws"))
Quando houver uma conexão aceita, o método anotado com
@BeforeHandshakeserá chamado
As aulas que são injetadas no método são: sessão, httpheaders ...
Quando houver uma conexão WebSocket concluída, o método anotado com
@OnOpenserá chamado
As aulas que são injetadas no método são: sessão, httpheaders ...
Quando uma conexão WebSocket fechada, o método anotado com
@OnCloseserá chamado de classes que serão injetadas no método são: sessão
Quando uma conexão WebSocket Throwtable, o método anotado com
@OnErrorserá chamado de classes que serão injetadas ao método são: Sessão, lançável
Quando uma conexão WebSocket recebeu uma mensagem, o método anotado com
@OnMessageserá chamado de classes que serão injetadas no método são: sessão, string
Quando uma conexão WebSocket recebeu o binário, o método anotado com
@OnBinaryserá chamado de classes que serão injetadas no método são: sessão, byte []
Quando uma conexão WebSocket recebeu o evento de Netty, o método anotado com
@OnEventserá chamado de classes que serão injetadas no método é: sessão, objeto
Todas as configurações são configuradas na propriedade do
@ServerEndpoint
| propriedade | padrão | descrição |
|---|---|---|
| caminho | "/" | O caminho do webSocket pode ser alias para value |
| hospedar | "0.0.0.0" | apresentador de websocket. "0.0.0.0" significa todos os endereços locais |
| porta | 80 | Porta de webSocket。Se a porta for igual a 0 ,, ela usará uma porta aleatória e disponível (para obter o ponto multi-endpoint da porta) |
| BossloopgroupThreads | 0 | Número de fios em Bosseventloopgroup |
| WorkerloopgroupThreads | 0 | Número de threads no Workerentloopgroup |
| UsoCompressionHandler | falso | Se adicionar websocketServerCompressionHandler ao pipeline |
| OptionConnectTimeOutMillis | 30000 | O mesmo que ChannelOption.CONNECT_TIMEOUT_MILLIS em Netty |
| Optionsobacklog | 128 | O mesmo que ChannelOption.SO_BACKLOG na rede |
| ChildOptionWriteSpincount | 16 | O mesmo que ChannelOption.WRITE_SPIN_COUNT na rede |
| ChildOptionWriteBufferHighwatermark | 64*1024 | O mesmo que ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK na netty, mas use ChannelOption.WRITE_BUFFER_WATER_MARK na verdade. |
| ChildOptionWriteBufferLowwatermark | 32*1024 | O mesmo que ChannelOption.WRITE_BUFFER_LOW_WATER_MARK na netty, mas use ChannelOption.WRITE_BUFFER_WATER_MARK na verdade. |
| ChildOptionsorcvbuf | -1 (significa não definido) | O mesmo que ChannelOption.SO_RCVBUF em netty |
| ChildOptionsoSndBuf | -1 (significa não definido) | O mesmo que ChannelOption.SO_SNDBUF em netty |
| ChildOptionTcpnodelay | verdadeiro | O mesmo que ChannelOption.TCP_NODELAY em Netty |
| ChildOptionSekeeepalive | falso | O mesmo que ChannelOption.SO_KEEPALIVE na rede |
| ChildOptionsolinger | -1 | O mesmo que ChannelOption.SO_LINGER em Netty |
| ChildOptionallowHalfclosure | falso | O mesmo que ChannelOption.ALLOW_HALF_CLOSURE na rede |
| ReaderidleTeMesegunds | 0 | O mesmo que readerIdleTimeSeconds em IdleStateHandler e adicione IdleStateHandler ao pipeline quando não estiver 0 |
| WriterIdleTeMesegunds | 0 | O mesmo que writerIdleTimeSeconds em IdleStateHandler e adicione IdleStateHandler ao pipeline quando não estiver 0 |
| AllIdleTeMesegunds | 0 | O mesmo que allIdleTimeSeconds em IdleStateHandler e adicione IdleStateHandler ao pipeline quando não estiver 0 |
| maxframepayloadLength | 65536 | Comprimento máximo de carga útil do quadro permitido. |
| useEventExecutorGroup | verdadeiro | Se deve usar outro pool de threads para executar a lógica de negócios síncrona demorada |
| EventExecutorGroupThreads | 16 | Número de fios em Bosseventloopgroup |
| SSLKEYPASSWORD | "" (significa não definido) | o mesmo que server.ssl.key-password em spring-boot |
| sslkeystore | "" (significa não definido) | o mesmo que server.ssl.key-store na boot de primavera |
| sslkeystorepassword | "" (significa não definido) | o mesmo que server.ssl.key-store-password em spring-boot |
| sslkeyStoreType | "" (significa não definido) | o mesmo que server.ssl.key-store-type no spring-boot |
| SSLTrustStore | "" (significa não definido) | o mesmo que server.ssl.trust-store no spring-boot |
| ssltrustStorePassword | "" (significa não definido) | o mesmo que server.ssl.trust-store-password em spring-boot |
| ssltrustStoreType | "" (significa não definido) | o mesmo que server.ssl.trust-store-type no spring-boot |
| corsoSorigins | {} (significa não definido) | O mesmo que @CrossOrigin#origins em Spring-Boot |
| corsairlowcredentials | "" (significa não definido) | o mesmo que @CrossOrigin#allowCredentials no spring-boot |
Você pode obter a configuração do
application.propertiesusando${...}espaço reservado. por exemplo:
${...} em @ServerEndpoint @ ServerEndpoint ( host = "${ws.host}" , port = "${ws.port}" )
public class MyWebSocket {
...
}application.properties ws.host=0.0.0.0
ws.port=80
A maneira de configurar o favicon é a mesma que a spring-boot.Se favicon.ico for apresentada na raiz do caminho de classe, ele será automaticamente usado como o favicon do aplicativo. O exemplo está seguindo:
src/
+- main/
+- java/
| + <source code>
+- resources/
+- favicon.ico
A maneira de configurar o Favicon é a mesma que a Spring-Boot. Você pode adicionar um arquivo a uma pasta /public/error O nome da página de erro deve ser o código de status exato ou uma máscara de série. O exemplo está seguindo:
src/
+- main/
+- java/
| + <source code>
+- resources/
+- public/
+- error/
| +- 404.html
| +- 5xx.html
+- <other public assets>
@ServerEndpoint e @Component em classes que esperam se tornar um ponto de extremidade.ServerEndpointExporter.getInetSocketAddressSet() .ServerBootstrap .ServerBootstrap .@PathVariable@RequestParam da consultaParameterMap , em vez de @RequestParam MultiValueMap@BeforeHandshake anotação , Você pode fechar o Connect antes do handshake@BeforeHandshake@Component na classe terminalNetty para 4.1.44.Final @RequestParam MultiValueMap para obter valorNetty para 4.1.45.Final ServerEndpointExporter manully @BeforeHandshake , NullPointerException aparecerá @BeforeHandshake , Session em OnOpen é nula Throwable no evento OnError é nulo bossLoopGroupThreads para 1useEventExecutorGroup para executar a lógica de negócios síncrona e demorada no EventExecutorGroup, para que o thread de E/S não seja bloqueado por uma tarefa demoradaNetty para 4.1.49.Final ServerEndpoint é proxiada pelo CGLIB (como no aprimoramento da AOP), ela ainda funciona @enableWebSocket adiciona o atributo scanBasePackages@serverEndpoint não depende mais do @ComponentNetty para 4.1.67.Final