中文文档 (المستندات الصينية)
سيساعدك Netty-Websocket-Spring-Boot-Starter على تطوير خادم WebSocket باستخدام 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 ، سيتم استدعاء الطريقة المشروحة مع
@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 | NUM من المواضيع في bosseventloopgroup |
| WorkerLoopGroupThreads | 0 | NUM من المواضيع في workereventloopgroup |
| USECUSSINGHALLLER | خطأ شنيع | ما إذا كان إضافة websocketservercompressionHandler إلى خط الأنابيب |
| OptionConnectTimeOutMillis | 30000 | نفس ChannelOption.CONNECT_TIMEOUT_MILLIS |
| OptionsObacklog | 128 | نفس ChannelOption.SO_BACKLOG |
| childoptionwritespincount | 16 | نفس ChannelOption.WRITE_SPIN_COUNT |
| 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 |
| childoptionsosndbuf | -1 (يعني عدم تعيين) | نفس ChannelOption.SO_SNDBUF |
| childoptiontcpnodelay | حقيقي | نفس قناة ChannelOption.TCP_NODELAY |
| childoptionsokeepalive | خطأ شنيع | نفس ChannelOption.SO_KEEPALIVE so_keepalive في netty |
| childoptionsolinger | -1 | نفس ChannelOption.SO_LINGER |
| childoptionallowhalfclosure | خطأ شنيع | نفس ChannelOption.ALLOW_HALF_CLOSURE |
| ReaderIdleTimeseConds | 0 | مثل readerIdleTimeSeconds في IdleStateHandler وإضافة IdleStateHandler إلى pipeline عندما لا يكون 0 |
| الكاتب | 0 | نفس نفس writerIdleTimeSeconds في IdleStateHandler وإضافة IdleStateHandler إلى pipeline عندما لا يكون 0 |
| allidletimeseconds | 0 | مثل allIdleTimeSeconds في IdleStateHandler وأضف IdleStateHandler إلى pipeline عندما لا يكون 0 |
| MaxframePayloadLength | 65536 | الحد الأقصى المسموح به طول الحمولة النافعة. |
| useEventExecutorgroup | حقيقي | سواء كنت تستخدم تجمع مؤشرات ترابط آخر لإجراء منطق أعمال متزامن يستغرق وقتًا طويلاً |
| EventExecutorGroupThreads | 16 | NUM من المواضيع في bosseventloopgroup |
| sslkeypassword | "" (يعني عدم تعيين) | نفس كلمة server.ssl.key-password في الربيع" |
| 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 ، وسيتم استخدامها تلقائيًا كمؤيد للتطبيق. مثال يتبع:
src/
+- main/
+- java/
| + <source code>
+- resources/
+- favicon.ico
طريقة تكوين Favicon هي نفس Spring-boot.ant يمكنك إضافة ملف إلى مجلد /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 enrotation , يمكنك إغلاق الاتصال قبل المصافحة@BeforeHandshake@Component على فئة نقطة النهايةNetty إلى 4.1.44.Final @RequestParam MultiValueMap للحصول على قيمةNetty إلى 4.1.45.Final ServerEndpointExporter Manully @BeforeHandshake ، سيظهر NullPointerException @BeforeHandshake ، Session في OnOpen خالية Throwable في حدث OnError فارغ bossLoopGroupThreads إلى 1useEventExecutorGroup لتشغيل منطق الأعمال المتزامن والمستهلك للوقت في EventexecutorGroup ، بحيث لا يتم حظر مؤشرود I/O بواسطة مهمة تستغرق وقتًا طويلاًNetty إلى 4.1.49.Final ServerEndpoint فئة CGLIB (كما هو الحال مع تحسين AOP) ، فإنها لا تزال تعمل @enableWebSocket يضيف سمة scanBasePackages@serverEndpoint لم يعد يعتمد على @ComponentNetty إلى 4.1.67.Final