WebSocket هو بروتوكول اتصالات الكمبيوتر ، ويوفر قنوات اتصال كاملة على اتصال TCP واحد. WebSocket متميز عن HTTP. يمكّن البروتوكول التفاعل بين متصفح الويب (أو تطبيق عميل آخر) وخادم ويب مع بدائل أقل من نصف دوبلك مثل الاقتراع HTTP ، وتسهيل نقل البيانات في الوقت الفعلي من الخادم وإلى الخادم.
بمجرد إنشاء اتصال WebSocket بين العميل والخادم ، يمكن كلاهما تبادل المعلومات حتى يتم إغلاق الاتصال من قبل أي من الأطراف.
هذا هو الطيبات الرئيسية التي يفضلها WebSocket على بروتوكول HTTP عند إنشاء خدمة اتصال شبيهة بالدردشة تعمل بترددات عالية مع زمن انتقال منخفض.
يعد بروتوكول الرسائل الموجهة نحو النص البسيط (أو الدفق) ، المعروف سابقًا باسم TTMP ، بروتوكولًا بسيطًا يعتمد على النص ، مصمم للعمل مع البرامج الوسطى الموجهة للرسائل (MOM). يوفر تنسيقًا سلكيًا قابل للتشغيل البيني يسمح لعملاء STOMP بالتحدث مع أي وسيط رسائل يدعم البروتوكول.
نظرًا لأن WebSocket هو مجرد بروتوكول اتصال ، فإنه لا يعرف كيفية إرسال رسالة إلى مستخدم معين. STOMP هو في الأساس بروتوكول المراسلة وهو مفيد لهذه الوظائف.
سيكون لتطبيقنا التكوين التالي الذي يمكن تعيينه باستخدام Spring initializr:
نسخة جافا: 11
النوع: مشروع Maven
التبعيات: WebSocket
إصدار التمهيد الربيع: 2.4.2
تكوين نقطة نهاية WebSocket ووساطة الرسائل بسيطة إلى حد ما.
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/websocket").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic");
registry.setApplicationDestinationPrefixes("/app");
}
}
يتم استخدام enableWebSocketMessageBroker تعليق لتمكين خادم WebSocket الخاص بنا.
يتم استخدام واجهة WebSocketMessageBrokERCONFIGURE لتوفير التنفيذ لبعض أساليبها لتكوين اتصال WebSocket.
يتم استخدام طريقة RecordStompendPoints لتسجيل نقطة نهاية WebSocket التي سيستخدمها العملاء للاتصال بالخادم.
يتم استخدام طريقة ConfigureMessageBroker لتكوين وسيط الرسائل الخاص بنا والذي سيتم استخدامه لتوجيه الرسائل من عميل إلى آخر.
يتم استخدام SockJS أيضًا لتمكين خيارات العودة للمتصفحات التي لا تدعم WebSocket.
نموذج الدردشة الخاص بنا هو حمولة الرسائل التي سيتم تبادلها بين جانب العميل وجانب الخادم للتطبيق.
public class ChatMessage {
private String content;
private String sender;
private MessageType type;
public enum MessageType {
*CHAT*, *LEAVE*, *JOIN
*}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getSender() {
return sender;
}
public void setSender(String sender) {
this.sender = sender;
}
public MessageType getType() {
return type;
}
public void setType(MessageType type) {
this.type = type;
}
}
ستكون وحدة التحكم الخاصة بنا مسؤولة عن التعامل مع جميع أساليب الرسائل الموجودة في تطبيق الدردشة الخاص بنا والتي ستتلقى رسائل من عميل واحد بشكل أساسي ومن ثم بثها إلى الآخرين.
@Controller
public class ChatController {
@MessageMapping("/chat.register")
@SendTo("/topic/public")
public ChatMessage register(@Payload ChatMessage chatMessage, SimpMessageHeaderAccessor headerAccessor) {
headerAccessor.getSessionAttributes().put("username", chatMessage.getSender());
return chatMessage;
}
@MessageMapping("/chat.send")
@SendTo("/topic/public")
public ChatMessage sendMessage(@Payload ChatMessage chatMessage) {
return chatMessage;
}
}
استخدام /APP كنقطة وجهة هو بسبب ملف تكوين WebSocket الخاص بنا والذي يقول أنه سيتم توجيه جميع الرسائل إلى طرق التعامل هذه المشروحة بـ messagemapping.
واجهة المستخدم الخاصة بنا عبارة عن مربع من cardbox بسيط تم تصميمه باستخدام HTML و CSS الذي يدير بعض وظائف JS لإرسال واستقبال الرسائل.