中文文档 (เอกสารภาษาจีน)
Netty-Websocket-Spring-Boot-Starter จะช่วยให้คุณพัฒนา WebSocket Server โดยใช้ Netty ใน Spring-Boot มันง่ายต่อการพัฒนาโดยใช้คำอธิบายประกอบเช่น Spring-Websocket
< dependency >
< groupId >org.yeauty</ groupId >
< artifactId >netty-websocket-spring-boot-starter</ artifactId >
< version >0.12.0</ version >
</ dependency >@ServerEndpoint ในคลาสปลายทาง, และคำอธิบายประกอบ @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การประกาศ
ServerEndpointExporterในการกำหนดค่าฤดูใบไม้ผลิจะสแกนสำหรับจุดสิ้นสุดของ WebSocket ที่มีคำอธิบายประกอบด้วยServerEndpointถั่วที่มีคำอธิบายประกอบด้วยServerEndpointจะลงทะเบียนเป็นจุดสิ้นสุดของ WebSocket การกำหนดค่าทั้งหมดอยู่ในคำอธิบายประกอบนี้ (เช่น@ServerEndpoint("/ws"))
เมื่อได้รับการยอมรับการเชื่อมต่อวิธีการที่มีคำอธิบายประกอบกับ
@BeforeHandshakeจะถูกเรียก
คลาสที่ถูกฉีดไปยังวิธีการคือ: เซสชัน, httpheaders ...
เมื่อมีการเชื่อมต่อ WebSocket เสร็จสมบูรณ์วิธีการที่มีการบันทึกคำอธิบายด้วย
@OnOpenจะถูกเรียก
คลาสที่ถูกฉีดไปยังวิธีการคือ: เซสชัน, httpheaders ...
เมื่อการเชื่อมต่อ WebSocket ปิดวิธีการที่มีคำอธิบายประกอบกับ
@OnCloseจะถูกเรียกว่าคลาสที่ถูกฉีดไปยังวิธีการคือ: เซสชัน
เมื่อการเชื่อมต่อ WebSocket throwable throwable วิธีการที่มีคำอธิบายประกอบกับ
@OnErrorจะถูกเรียกว่าคลาสที่ถูกฉีดเข้าไปในวิธีการคือ: เซสชัน
เมื่อการเชื่อมต่อ WebSocket ได้รับข้อความวิธีการที่มีคำอธิบายประกอบกับ
@OnMessageจะถูกเรียกว่าคลาสที่ถูกฉีดไปยังวิธีการคือ: เซสชัน, สตริง
เมื่อการเชื่อมต่อ 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 | เท็จ | ไม่ว่าจะเพิ่ม WebSocketSerMpressionHandler ไปยัง Pipeline |
| OptionConnectTimeOutmillis | 30000 | เช่นเดียวกับ ChannelOption.CONNECT_TIMEOUT_MILLIS ใน netty |
| OptionsObacklog | 128 | เช่นเดียวกับ ChannelOption.SO_BACKLOG ใน netty |
| ChildOptionWritEspinCount | 16 | เช่นเดียวกับ ChannelOption.WRITE_SPIN_COUNT ใน netty |
| ChildOptionWriteBufferHighwatermark | 64*1024 | เช่นเดียวกับ ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK ใน netty แต่ใช้ ChannelOption.WRITE_BUFFER_WATER_MARK ในความเป็นจริง |
| ChildOptionWriteBufferLowwatermark | 32*1024 | เช่นเดียวกับ ChannelOption.WRITE_BUFFER_LOW_WATER_MARK ใน Netty แต่ใช้ ChannelOption.WRITE_BUFFER_WATER_MARK ในความเป็นจริง |
| ChildOptionsorcvbuf | -1 (ไม่ได้ตั้งค่าเฉลี่ย) | เช่นเดียวกับ ChannelOption.SO_RCVBUF ใน netty |
| ChildOptionSosndBuf | -1 (ไม่ได้ตั้งค่าเฉลี่ย) | เช่นเดียวกับ ChannelOption.SO_SNDBUF ใน netty |
| ChildOptiontcpNodelay | จริง | เช่นเดียวกับ ChannelOption.TCP_NODELAY ใน netty |
| Childoptionsokeepalive | เท็จ | เช่นเดียวกับ ChannelOption.SO_KEEPALIVE ใน netty |
| Childoptionsolinger | -1 | เช่นเดียวกับ ChannelOption.SO_LINGER ใน netty |
| ChildOptionallowhalfclosure | เท็จ | เช่นเดียวกับ ChannelOption.ALLOW_HALF_CLOSURE ใน netty |
| ReaderIdletimeseconds | 0 | เช่นเดียวกับ readerIdleTimeSeconds ใน IdleStateHandler และเพิ่ม IdleStateHandler ลงใน pipeline เมื่อไม่ใช่ 0 |
| writeridletimeseconds | 0 | เช่นเดียวกับ writerIdleTimeSeconds ใน IdleStateHandler และเพิ่ม IdleStateHandler ลงใน pipeline เมื่อไม่ใช่ 0 |
| allidletimeseconds | 0 | เช่นเดียวกับ allIdleTimeSeconds ใน IdleStateHandler และเพิ่ม IdleStateHandler ลงใน pipeline เมื่อไม่ใช่ 0 |
| maxframepayload ความยาว | 65536 | ความยาวของเฟรมที่อนุญาตสูงสุดที่อนุญาต |
| useVentExecutorGroup | จริง | ไม่ว่าจะใช้พูลเธรดอื่นเพื่อดำเนินการตรรกะทางธุรกิจแบบซิงโครนัสใช้เวลานาน |
| EventExecutorGroupThreads | 16 | จำนวนเธรดใน BossEventLoopGroup |
| sslkeypassword | "" (ไม่ได้ตั้งค่าหมายความว่า) | เช่นเดียวกับ server.ssl.key-password ใน Spring-Boot |
| sslkeystore | "" (ไม่ได้ตั้งค่าหมายความว่า) | เช่นเดียวกับ server.ssl.key-store ใน Spring-Boot |
| sslkeystorepassword | "" (ไม่ได้ตั้งค่าหมายความว่า) | เช่นเดียวกับ server.ssl.key-store-password ใน Spring-Boot |
| sslkeystoretype | "" (ไม่ได้ตั้งค่าหมายความว่า) | เช่นเดียวกับ server.ssl.key-store-type ใน Spring-Boot |
| ssltruststore | "" (ไม่ได้ตั้งค่าหมายความว่า) | เช่นเดียวกับ server.ssl.trust-store ใน Spring-Boot |
| ssltruststorepassword | "" (ไม่ได้ตั้งค่าหมายความว่า) | เช่นเดียวกับ server.ssl.trust-store-password ใน Spring-Boot |
| ssltruststoretype | "" (ไม่ได้ตั้งค่าหมายความว่า) | เช่นเดียวกับ server.ssl.trust-store-type ใน Spring-Boot |
| Corsorigins | {} (ไม่ได้ตั้งค่าเฉลี่ย) | เช่นเดียวกับ @CrossOrigin#origins ใน Spring-Boot |
| Corsallowcredentials | "" (ไม่ได้ตั้งค่าหมายความว่า) | เช่นเดียวกับ @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@RequestParam จากการสืบค้นParameterMap แทนที่จะเป็น @RequestParam MultiValueMap@BeforeHandshake คำอธิบายประกอบ, คุณสามารถปิดการเชื่อมต่อก่อนจับมือกัน@BeforeHandshake@Component ในคลาสปลายทางNetty เป็น 4.1.44.Final @RequestParam MultiValueMap เพื่อรับค่าNetty เป็น 4.1.45.Final ServerEndpointExporter Manully @BeforeHandshake , nullpointerexception จะปรากฏขึ้น @BeforeHandshake Session ใน OnOpen จะเป็นโมฆะ OnError Throwable bossLoopGroupThreads เป็น 1useEventExecutorGroup ให้เรียกใช้ตรรกะทางธุรกิจแบบซิงโครนัสและใช้เวลานานใน EventExecutorGroup เพื่อให้เธรด I/O ไม่ถูกบล็อกโดยงานที่ใช้เวลานานNetty เป็น 4.1.49.Final ServerEndpoint ถูก proxied โดย cglib (เช่นเดียวกับการปรับปรุง AOP) มันก็ยังใช้งานได้ @enableWebSocket เพิ่มแอตทริบิวต์ scanBasePackages@serverEndpoint ไม่ได้ขึ้นอยู่กับ @Component อีกต่อไปNetty เป็น 4.1.67.Final