Rmessage เป็น API การพุชข้อความแบบเรียลไทม์ที่สร้างขึ้นบนโปรเจ็กต์ reactor-netty โดยใช้ Reactor3
Reactor3 คืออะไร?
Reactor เป็นเฟรมเวิร์กการเขียนโปรแกรมเชิงโต้ตอบที่ไม่มีการบล็อกโดยสิ้นเชิงสำหรับ JVM พร้อมด้วยความสามารถด้านการจัดการความต้องการที่มีประสิทธิภาพ (เช่น การควบคุม "แรงดันย้อนกลับ") โดยผสานรวมโดยตรงกับ API การทำงานของ Java 8 เช่น CompletableFuture, Stream และ Duration โดยจัดเตรียม API Flux ลำดับแบบอะซิงโครนัส (สำหรับองค์ประกอบ [N]) และโมโน (สำหรับองค์ประกอบ [0|1]) และติดตามและปรับใช้ "ข้อกำหนดส่วนขยายเชิงโต้ตอบ" อย่างสมบูรณ์
การใช้เครื่องปฏิกรณ์มีประโยชน์อย่างไร?
มันง่ายมากที่จะสร้างโค้ดอะซิงโครนัสบริสุทธิ์ที่มีปริมาณงานสูง และสามารถรวมโปรเจ็กต์ spring5 [webflux] ได้อย่างราบรื่น
หากต้องการใช้ Rmessage คุณต้องจัดการความสัมพันธ์ของผู้ใช้กลุ่มจากภายนอกและการจัดเก็บข้อความออฟไลน์ Rmessage ไม่มีความคงอยู่ การทดสอบสามารถใช้หน่วยความจำตัวจัดการเริ่มต้นเพื่อเก็บข้อความออฟไลน์ โครงการทั้งหมดได้รับการพัฒนาโดยใช้แนวคิดการเขียนโปรแกรมแบบอะซิงโครนัสล้วนๆ โดยมีเป้าหมายเพื่อเรียนรู้การเขียนโปรแกรมแบบโต้ตอบ
ServerStart
. builder ()
. tcp ()
. ip ( "127.0.0.1" )
. port ( 1888 )
. onReadIdle ( 10000l ) //设置读心跳时间
. onWriteIdle ( 10000l ) //设置写心跳时间
. option ( ChannelOption . SO_RCVBUF , 1023 )
. interceptor ( frame -> frame , frame -> frame ) // 拦截所有message
. setAfterChannelInit ( channel -> { // channel设置
})
. connect ()
. cast ( TcpServerSession . class )
. subscribe ( session ->{
session . addGroupHandler ( groupId -> null ). subscribe ();
session . addOfflineHandler ( new DefaultOffMessageHandler ()). subscribe ();
session . addUserHandler ( new DefaultUserTransportHandler ());
});
ClientStart
. builder ()
. tcp ()
. ip ( "127.0.0.1" )
. port ( 1888 )
. userId ( "21344" ) //设置用户名
. password ( "12312" ) //设置密码
. onReadIdle ( 10000l ,()->()-> System . out . println ( "心跳了" )) //设置读心跳,以及设置回调runner
. setClientType ( ClientType . Ios ) //设置客户端类型
. setAfterChannelInit ( channel -> {
// channel设置
})
. connect ()
. cast ( TcpClientSession . class )
. subscribe ( session ->{
session . sendPoint ( "123" , "测试一下哦" ). subscribe (); //发送单聊消息
session . sendGroup ( "group1" , "123" ). subscribe (); // 发送群聊消息
session . accept ( message -> {
}); // 接受所有消息
});
แก้ไขส่วนหัว【1 ไบต์】
ลูกค้า_ประเภท | message_type |
---|---|
สูง 4 บิต | 4 บิตต่ำ |
หัวข้อ 【n ไบต์】
จากความยาว | ยาว | จาก | ถึง |
---|---|---|---|
1 ไบต์ | 1 ไบต์ | n ไบต์ | n ไบต์ |
เนื้อความ [n ไบต์]
ความยาวลำตัว | ร่างกาย |
---|---|
2 ไบต์ | n ไบต์ |
ประทับตราเวลา |
---|
8 ไบต์ |
แก้ไขส่วนหัว【1 ไบต์】
ลูกค้า_ประเภท | message_type |
---|---|
สูง 4 บิต | 4 บิตต่ำ |
สถานะการเชื่อมต่อ [n ไบต์]
ความยาวของผู้ใช้ | ความยาวรหัสผ่าน | ผู้ใช้ | รหัสผ่าน |
---|---|---|---|
1 ไบต์ | 1 ไบต์ | n ไบต์ | n ไบต์ |
แก้ไขส่วนหัว【1 ไบต์】
ลูกค้า_ประเภท | message_type |
---|---|
สูง 4 บิต | 4 บิตต่ำ |
สถานะการเชื่อมต่อ [n ไบต์]
ความยาวของผู้ใช้ | ผู้ใช้ |
---|---|
1 ไบต์ | n ไบต์ |
แก้ไขส่วนหัว【1 ไบต์】
ลูกค้า_ประเภท | message_type |
---|---|
สูง 4 บิต | 4 บิตต่ำ |