中文文档 (Dokumen Cina)
Netty-Websocket-Spring-Boot-Starter akan membantu Anda mengembangkan server WebSocket dengan menggunakan Netty di Spring-Boot, mudah dikembangkan dengan menggunakan anotasi seperti Spring-Websocket
< dependency >
< groupId >org.yeauty</ groupId >
< artifactId >netty-websocket-spring-boot-starter</ artifactId >
< version >0.12.0</ version >
</ dependency >@ServerEndpoint di kelas endpoint , dan annotate @BeforeHandshake , @OnOpen , @OnClose , @OnError , @OnMessage , @OnBinary , @OnEvent pada metode ini. misalnya @ 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/xxxDeklarasikan
ServerEndpointExporterdalam konfigurasi pegas, ini akan memindai titik akhir Websocket yang dijelaskan denganServerEndpoint. Kacang yang dijelaskan denganServerEndpointakan terdaftar sebagai titik akhir Websocket. Semua konfigurasi ada di dalam anotasi ini (misalnya@ServerEndpoint("/ws"))
Ketika ada koneksi yang diterima, metode yang dijelaskan dengan
@BeforeHandshakeakan dipanggil
Kelas yang disuntikkan ke metode ini adalah: sesi, httpheaders ...
Ketika ada koneksi WebSocket selesai, metode yang dijelaskan dengan
@OnOpenakan dipanggil
Kelas yang disuntikkan ke metode ini adalah: sesi, httpheaders ...
Ketika koneksi Websocket ditutup, metode yang dijelaskan dengan
@OnCloseakan disebut kelas yang disuntikkan ke metode ini adalah: sesi
Saat lemparan koneksi Websocket dapat dilempar, metode yang dijelaskan dengan
@OnErrorakan disebut kelas yang disuntikkan ke metode ini adalah: sesi, lempar
Ketika koneksi WebSocket menerima pesan, metode yang dijelaskan dengan
@OnMessageakan disebut kelas yang disuntikkan ke metode ini adalah: sesi, string
Ketika koneksi Websocket menerima biner, metode yang dijelaskan dengan
@OnBinaryakan disebut kelas yang disuntikkan ke metode ini adalah: sesi, byte []
Ketika koneksi Websocket menerima acara Netty, metode yang dijelaskan dengan
@OnEventakan disebut kelas yang disuntikkan ke metode ini adalah: sesi, objek
Semua konfigurasi dikonfigurasi di properti
@ServerEndpoint
| milik | bawaan | keterangan |
|---|---|---|
| jalur | "/" | Jalur Websocket dapat alias untuk value |
| tuan rumah | "0.0.0.0” | Host Websocket. "0.0.0.0" berarti semua alamat lokal |
| pelabuhan | 80 | Port Websocket。if port sama dengan 0, itu akan menggunakan port acak dan tersedia (untuk mendapatkan port multi-endpoint) |
| BossLoopGroupThreads | 0 | Jumlah utas di BossEventLoopGroup |
| WorkerLoopGroupThreads | 0 | Jumlah utas di WorkerEventLoopGroup |
| UsecompressionHandler | PALSU | apakah menambahkan WebSocketServerCompressionHandler ke pipa |
| OptionConnectTimeOutMillis | 30000 | Sama seperti ChannelOption.CONNECT_TIMEOUT_MILLIS di Netty |
| OptionsObackLog | 128 | Sama seperti ChannelOption.SO_BACKLOG di Netty |
| ChildOptionWriteSpincount | 16 | Sama seperti ChannelOption.WRITE_SPIN_COUNT di netty |
| ChildOptionWriteBufferHighWatermark | 64*1024 | Sama seperti ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK di netty, tetapi gunakan ChannelOption.WRITE_BUFFER_WATER_MARK sebenarnya. |
| ChildOptionWriteBufferLowWatermark | 32*1024 | Sama seperti ChannelOption.WRITE_BUFFER_LOW_WATER_MARK di netty, tetapi gunakan ChannelOption.WRITE_BUFFER_WATER_MARK sebenarnya. |
| ChildOptionsorcvbuf | -1 (berarti tidak diatur) | Sama seperti ChannelOption.SO_RCVBUF di Netty |
| Childoptionsosndbuf | -1 (berarti tidak diatur) | Sama seperti ChannelOption.SO_SNDBUF di Netty |
| ChildOptiontcpnodelay | BENAR | Sama seperti ChannelOption.TCP_NODELAY di Netty |
| ChildOptionsokeEpalive | PALSU | Sama seperti ChannelOption.SO_KEEPALIVE di Netty |
| ChildOptionsolinger | -1 | Sama seperti ChannelOption.SO_LINGER di Netty |
| ChildOptionAllowHalfclosure | PALSU | Sama seperti ChannelOption.ALLOW_HALF_CLOSURE di netty |
| readeridletimeseconds | 0 | Sama seperti readerIdleTimeSeconds di IdleStateHandler dan tambahkan IdleStateHandler ke pipeline saat bukan 0 |
| writeridletimeseconds | 0 | Sama seperti writerIdleTimeSeconds di IdleStateHandler dan tambahkan IdleStateHandler ke pipeline saat itu bukan 0 |
| allidletimeseconds | 0 | Sama seperti allIdleTimeSeconds di IdleStateHandler dan tambahkan IdleStateHandler ke pipeline saat bukan 0 |
| MAXFRAMEPAYLOADLENGT | 65536 | Panjang muatan bingkai maksimum yang diijinkan. |
| UseEventExecutOrgroup | BENAR | Apakah akan menggunakan kumpulan utas lain untuk melakukan logika bisnis sinkron yang memakan waktu |
| EventExecutOrgroupThreads | 16 | Jumlah utas di BossEventLoopGroup |
| sslkeypassword | "" (berarti tidak diatur) | Sama seperti server.ssl.key-password di boot musim semi |
| SSLKEYSTORE | "" (berarti tidak diatur) | Sama seperti server.ssl.key-store di boot musim semi |
| sslkeystorepassword | "" (berarti tidak diatur) | Sama seperti server.ssl.key-store-password di boot Spring |
| SSLKeyStoreType | "" (berarti tidak diatur) | Sama seperti server.ssl.key-store-type di boot musim semi |
| ssltruststore | "" (berarti tidak diatur) | Sama seperti server.ssl.trust-store di boot musim semi |
| ssltruststorePassword | "" (berarti tidak diatur) | Sama seperti server.ssl.trust-store-password di Spring-Boot |
| SSLTRUSTSTORETYPE | "" (berarti tidak diatur) | Sama seperti server.ssl.trust-store-type di boot spring |
| Korsorigin | {} (berarti tidak diatur) | Sama seperti @CrossOrigin#origins di boot musim semi |
| Corsallowcredentials | "" (berarti tidak diatur) | Sama seperti @CrossOrigin#allowCredentials di Spring-Boot |
Anda bisa mendapatkan konfigurasi
application.propertiesdengan menggunakan${...}placeholder. Misalnya:
${...} di @ServerEndpoint @ ServerEndpoint ( host = "${ws.host}" , port = "${ws.port}" )
public class MyWebSocket {
...
}application.properties ws.host=0.0.0.0
ws.port=80
Cara Mengkonfigurasi Favicon sama dengan Spring-Boot. Jika favicon.ico disajikan pada akar classpath, itu akan secara otomatis digunakan sebagai favicon aplikasi. Contohnya berikut:
src/
+- main/
+- java/
| + <source code>
+- resources/
+- favicon.ico
Cara Mengkonfigurasi Favicon sama dengan Spring-Boot. Anda dapat menambahkan file ke folder /public/error Nama halaman kesalahan harus menjadi kode status yang tepat atau mask seri. Contohnya berikut:
src/
+- main/
+- java/
| + <source code>
+- resources/
+- public/
+- error/
| +- 404.html
| +- 5xx.html
+- <other public assets>
@ServerEndpoint dan @Component di kelas yang berharap untuk menjadi titik akhir.ServerEndpointExporter.getInetSocketAddressSet() .ServerBootstrap yang berbeda.ServerBootstrap yang sama.@PathVariable@RequestParam dari kueriParameterMap , bukan @RequestParam MultiValueMap@BeforeHandshake , Anda dapat menutup koneksi sebelum jabat tangan@BeforeHandshake acara@Component di kelas endpointNetty ke 4.1.44.Final @RequestParam MultiValueMap untuk mendapatkan nilaiNetty ke 4.1.45.Final ServerEndpointExporter dengan manully @BeforeHandshake , nullpointerException akan muncul @BeforeHandshake , Session di OnOpen adalah nol Throwable di acara OnError adalah nol bossLoopGroupThreads menjadi 1useEventExecutorGroup untuk menjalankan logika bisnis yang sinkron dan memakan waktu di EventExecutOrgroup, sehingga utas I/O tidak diblokir oleh tugas yang memakan waktuNetty ke 4.1.49.Final ServerEndpoint diproksi oleh cglib (seperti halnya peningkatan AOP), masih berfungsi @enableWebSocket Menambahkan atribut scanBasePackages@serverEndpoint tidak lagi tergantung pada @ComponentNetty ke 4.1.67.Final