中文文档 (중국 문서)
Netty-Websocket-Spring-Boot-Starter는 Spring-Boot에서 Netty를 사용하여 WebSocket 서버를 개발하는 데 도움이되며 Spring-Websocket과 같은 주석을 사용하여 쉽게 개발할 수 있습니다.
< dependency >
< groupId >org.yeauty</ groupId >
< artifactId >netty-websocket-spring-boot-starter</ artifactId >
< version >0.12.0</ version >
</ dependency >@ServerEndpoint 및 annotate @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 연결하십시오Spring 구성에서
ServerEndpointExporter선언하면ServerEndpoint와 주석이 달린 WebSocket 엔드 포인트를 스캔합니다.ServerEndpoint와 주석이 달린 Bean은 WebSocket 엔드 포인트로 등록됩니다. 모든 구성은이 주석 내에 있습니다 (예 :@ServerEndpoint("/ws"))
접수 된 연결이 있으면
@BeforeHandshake로 주석이 달린 메소드가 호출됩니다.
이 방법에 주입되는 클래스는 다음과 같습니다. 세션, httpheaders ...
WebSocket 연결이 완료되면
@OnOpen으로 주석이 달린 메소드가 호출됩니다.
이 방법에 주입되는 클래스는 다음과 같습니다. 세션, httpheaders ...
WebSocket 연결이 닫히면
@OnClose로 주석이 달린 메소드는 메소드에 주입되는 클래스라고합니다. 세션은 다음과 같습니다.
WebSocket 연결을 던질 수 있으면
@OnError로 주석이 붙은 메소드는 메소드에 주입되는 클래스로 호출됩니다.
WebSocket 연결이 메시지를 받았을 때
@OnMessage로 주석이 달린 메소드는 메소드에 주입되는 클래스라고합니다. 세션, String
WebSocket 연결이 바이너리를 수신하면
@OnBinary로 주석이 달린 메소드는 메소드에 주입되는 클래스라고 불립니다. 세션, 바이트 []
WebSocket 연결이 Netty의 이벤트를 받았을 때
@OnEvent로 주석이 달린 메소드는 메소드에 주입되는 클래스라고합니다. 세션, 개체
모든 구성은
@ServerEndpoint의 속성에 구성됩니다
| 재산 | 기본 | 설명 |
|---|---|---|
| 길 | "/" | WebSocket의 경로는 value 을 별명 할 수 있습니다 |
| 주인 | "0.0.0.0" | WebSocket의 호스트. "0.0.0.0" 은 모든 로컬 주소를 의미합니다 |
| 포트 | 80 | WebSocket의 포트가 0과 같으면 무작위 및 사용 가능한 포트를 사용합니다 (포트 멀티 엔드 포인트를 얻기 위해) |
| BossLoopGroupThreads | 0 | BosseventLoopgroup의 실 |
| WorkerLoopGroupThreads | 0 | workereventLoopGroup의 스레드 마모 |
| usecompressionhandler | 거짓 | WebSocketServerCompressionHandler를 파이프 라인에 추가하든 |
| OptionConnectTimeoutMillis | 30000 | Netty의 ChannelOption.CONNECT_TIMEOUT_MILLIS 와 동일합니다 |
| OptionsObackLog | 128 | Netty의 ChannelOption.SO_BACKLOG 와 동일합니다 |
| childoptionwritespincount | 16 | Netty의 ChannelOption.WRITE_SPIN_COUNT 와 동일합니다 |
| childoptionwritebufferhighwatermark | 64*1024 | Netty의 ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK 와 동일하지만 실제로 ChannelOption.WRITE_BUFFER_WATER_MARK 사용하십시오. |
| childoptionwritebufferlowwatermark | 32*1024 | Netty의 ChannelOption.WRITE_BUFFER_LOW_WATER_MARK 와 동일하지만 실제로 ChannelOption.WRITE_BUFFER_WATER_MARK 사용하십시오. |
| childoptionsorcvbuf | -1 (평균 설정되지 않음) | Netty의 ChannelOption.SO_RCVBUF 와 동일합니다 |
| childoptionsosndbuf | -1 (평균 설정되지 않음) | Netty의 ChannelOption.SO_SNDBUF 와 동일합니다 |
| childoptiontcpnodelay | 진실 | Netty의 ChannelOption.TCP_NODELAY 와 동일합니다 |
| hildoptionsokeepalive | 거짓 | Netty의 ChannelOption.SO_KEEPALIVE 와 동일합니다 |
| Childoptionsolinger | -1 | Netty의 ChannelOption.SO_LINGER 와 동일합니다 |
| childoptionallowhalfloscoy | 거짓 | Netty의 ChannelOption.ALLOW_HALF_CLOSURE 와 동일합니다 |
| readerIdletimeseconds | 0 | IdleStateHandler 의 readerIdleTimeSeconds 와 동일하고 0이 아닌 경우 pipeline 에 IdleStateHandler 추가합니다. |
| Writeridletimeseconds | 0 | IdleStateHandler 의 writerIdleTimeSeconds 와 동일하고 0이 아닌 경우 pipeline 에 IdleStateHandler 추가합니다. |
| allidletimeseconds | 0 | IdleStateHandler 의 allIdleTimeSeconds 와 동일하고 0이 아닌 경우 pipeline 에 IdleStateHandler 추가합니다. |
| maxframepayloadlength | 65536 | 최대 허용 프레임 페이로드 길이. |
| useeventExecutorGroup | 진실 | 다른 스레드 풀을 사용하여 시간이 많이 걸리는 동기 비즈니스 로직을 수행할지 여부 |
| eventExecutorGroupThreads | 16 | BosseventLoopgroup의 실 |
| sslkeypassword | ""(평균 설정이 없음) | Spring-Boot의 server.ssl.key-password 와 동일합니다 |
| sslkeystore | ""(평균 설정이 없음) | 스프링 부츠의 server.ssl.key-store 와 동일합니다 |
| sslkeystorepassword | ""(평균 설정이 없음) | Spring-Boot의 server.ssl.key-store-password 와 동일합니다 |
| sslkeystoreType | ""(평균 설정이 없음) | 스프링 부츠의 server.ssl.key-store-type 과 동일합니다 |
| ssltruststore | ""(평균 설정이 없음) | 스프링 부츠의 server.ssl.trust-store 와 동일합니다 |
| ssltruststorepassword | ""(평균 설정이 없음) | Spring-Boot의 server.ssl.trust-store-password 와 동일합니다 |
| ssltrustStoreType | ""(평균 설정이 없음) | 스프링 부츠의 server.ssl.trust-store-type 과 동일합니다 |
| 코르소리종 | {} (평균 설정되지 않음) | 스프링 부츠의 @CrossOrigin#origins 와 동일합니다 |
| Corsallowcredentials | ""(평균 설정이 없음) | Spring-Boot에서 @CrossOrigin#allowCredentials 과 동일합니다 |
${...}자리 표시자를 사용하여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 가 classpath의 루트에 표시되며 응용 프로그램의 favicon으로 자동으로 사용됩니다. 예제는 다음과 같습니다.
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 의 RESTFUL을 지원합니다@RequestParam 으로 param을 가져옵니다@RequestParam MultiValueMap 대신 ParameterMap 을 제거하십시오@BeforeHandshake 주석을 추가하면 핸드 셰이크 전에 연결을 닫을 수 있습니다@BeforeHandshake 이벤트에서 하위 프로콜을 설정하십시오@Component 제거하십시오Netty 버전을 4.1.44.Final 로 업데이트하십시오 @RequestParam MultiValueMap 사용할 때 가치를 얻기 위해 NULL이되었습니다.Netty 버전을 4.1.45.Final 로 업데이트하십시오 ServerEndpointExporter Manully를 구성 할 수있는 0.8.0 미만의 호환성 버전이 있습니다. @BeforeHandshake 없으면 NullPointerException이 나타납니다. @BeforeHandshake 가 없으면 OnOpen 의 Session null입니다. OnError 이벤트에 Throwable 있습니다 bossLoopGroupThreads 의 기본값을 1로 수정했습니다useEventExecutorGroup 구성을 지원하므로 시간이 소요되는 작업에 의해 I/O 스레드가 차단되지 않도록합니다.Netty 버전을 4.1.49.Final 로 업데이트하십시오 ServerEndpoint 클래스가 CGLIB (AOP Enhancement와 같이)에 의해 프록시되면 여전히 작동합니다. @enableWebSocket scanBasePackages 속성을 추가합니다@serverEndpoint 더 이상 @Component 에 의존하지 않습니다Netty 버전을 4.1.67.Final 으로 업데이트하십시오