Melaksanakan Bilik Sembang Awam
Bangunkan fungsi supaya pengguna boleh menyertai dan mengambil bahagian dalam bilik sembang awam berbentuk siaran.
Melaksanakan Bilik Sembang Awam ialah pelajaran WebSockets dan Sistem Masa Nyata dengan Spring percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran WebSockets dan Sistem Masa Nyata dengan Spring, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus WebSockets dan Sistem Masa Nyata dengan Spring merangkumi sejumlah 4 pelajaran.
Penjelasan Ruang Sembang Awam
Selamat datang! Dalam pelajaran ini, kita akan membina ruang sembang awam. Ruang ini ialah tempat bersama yang membolehkan ramai pengguna menghantar dan menerima mesej yang dapat dilihat oleh semua orang dalam ruang tersebut.
Bayangkan saluran perbincangan umum dalam aplikasi pemesejan. Ciri utamanya ialah komunikasi siaran: satu mesej yang dihantar oleh mana-mana pengguna akan disampaikan serta-merta kepada semua pengguna lain yang sedang berada dalam ruang itu.
Topik STOMP untuk Ruang
Dalam Spring dengan STOMP, kami menggunakan topik untuk mewakili ruang sembang. Topik adalah seperti saluran yang boleh dilanggan oleh klien. Mesej yang dihantar kepada topik akan disiarkan kepada semua pelanggannya.
- Untuk ruang awam, kami sering menggunakan laluan topik umum seperti
/topic/public-chat. - Klien melanggan topik ini untuk menerima mesej.
- Klien menghantar mesej kepada destinasi aplikasi tertentu, kemudian pelayan memajukannya kepada topik tersebut.
Model Mesej Sembang Ringkas
Sebelum melaksanakan logik sembang, kita memerlukan struktur ringkas untuk mesej kita. Ini membantu memastikan semua orang memahami data yang dihantar.
ChatMessage asas mungkin mengandungi type mesej (contohnya, CHAT, JOIN, LEAVE), nama sender dan content sebenar. Berikut ialah gambaran ringkas:
public class ChatMessage {
public enum MessageType {
CHAT,
JOIN,
LEAVE
}
private MessageType type;
private String content;
private String sender;
public ChatMessage() {}
public MessageType getType() { return type; }
public void setType(MessageType type) { this.type = type; }
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; }
@Override
public String toString() {
return "ChatMessage{" + "type=" + type + ", sender='" + sender + "', content='" + content + "'}";
}
}Pengawal Sembang di Sebelah Pelayan
Untuk mengendalikan mesej chat yang masuk dan menyiarkannya, kami akan mencipta @Controller Spring. Controller ini akan mendengar mesej yang dihantar ke destinasi aplikasi tertentu (contohnya, /app/chat.sendMessage) dan kemudian menggunakan SimpMessageSendingOperations (biasanya SimpMessagingTemplate) untuk menyiarkannya ke topik awam kami (/topic/public-chat).
Cuba jalankan contoh ini:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.messaging.simp.SimpMessageSendingOperations;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.stereotype.Controller;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
// ChatMessage POJO (for simplicity, included here)
class ChatMessage {
public enum MessageType { CHAT, JOIN, LEAVE }
private MessageType type;
private String content;
private String sender;
public ChatMessage() {}
public MessageType getType() { return type; }
public void setType(MessageType type) { this.type = type; }
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; }
@Override
public String toString() {
return "ChatMessage{" + "type=" + type + ", sender='" + sender + "', content='" + content + "'}";
}
}
// WebSocket Configuration
@Configuration
@EnableWebSocketMessageBroker
class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws").withSockJS();
}
}
// Chat Controller
@Controller
class ChatController {
private final SimpMessageSendingOperations messagingTemplate;
public ChatController(SimpMessageSendingOperations messagingTemplate) {
this.messagingTemplate = messagingTemplate;
}
@MessageMapping("/chat.sendMessage")
public void sendMessage(@Payload ChatMessage chatMessage) {
System.out.println("Received CHAT message from " + chatMessage.getSender() + ": " + chatMessage.getContent());
messagingTemplate.convertAndSend("/topic/public-chat", chatMessage);
}
}
// Main Application
@SpringBootApplication
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
System.out.println("\n--- Spring Boot Chat Server Started ---");
System.out.println("Connect to ws://localhost:8080/ws");
System.out.println("Send CHAT messages to /app/chat.sendMessage and subscribe to /topic/public-chat");
}
}Menyiarkan Penyertaan Pengguna
Apabila pengguna mula-mula bersambung atau menyertai bilik chat secara khusus, amalan yang baik ialah memaklumkan perkara itu kepada semua pengguna lain. Kita boleh melakukannya dengan menghantar mesej khas berjenis JOIN.
@MessageMapping kita boleh mengesan peristiwa penyertaan ini dan menyiarkannya ke topik awam yang sama. Dengan cara ini, semua klien mengetahui siapa yang telah memasuki bilik tersebut.
Mari kita lanjutkan ChatController untuk mengendalikan mesej JOIN:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.messaging.simp.SimpMessageSendingOperations;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.stereotype.Controller;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
class ChatMessage {
public enum MessageType { CHAT, JOIN, LEAVE }
private MessageType type;
private String content;
private String sender;
public ChatMessage() {}
public MessageType getType() { return type; }
public void setType(MessageType type) { this.type = type; }
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; }
@Override
public String toString() {
return "ChatMessage{" + "type=" + type + ", sender='" + sender + "', content='" + content + "'}";
}
}
@Configuration
@EnableWebSocketMessageBroker
class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws").withSockJS();
}
}
@Controller
class ChatController {
private final SimpMessageSendingOperations messagingTemplate;
public ChatController(SimpMessageSendingOperations messagingTemplate) {
this.messagingTemplate = messagingTemplate;
}
@MessageMapping("/chat.sendMessage")
public void sendMessage(@Payload ChatMessage chatMessage) {
System.out.println("Received CHAT message from " + chatMessage.getSender() + ": " + chatMessage.getContent());
messagingTemplate.convertAndSend("/topic/public-chat", chatMessage);
}
@MessageMapping("/chat.addUser")
public void addUser(@Payload ChatMessage chatMessage) {
if (chatMessage.getType() == ChatMessage.MessageType.JOIN) {
System.out.println(chatMessage.getSender() + " JOINED the chat!");
messagingTemplate.convertAndSend("/topic/public-chat", chatMessage);
}
}
}
@SpringBootApplication
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
System.out.println("\n--- Spring Boot Chat Server Started with JOIN handling ---");
System.out.println("Connect to ws://localhost:8080/ws");
System.out.println("Send JOIN messages to /app/chat.addUser");
System.out.println("Send CHAT messages to /app/chat.sendMessage");
System.out.println("Subscribe to /topic/public-chat");
}
}Klien: Bersambung & Melanggan
Di sisi klien (contohnya, menggunakan JavaScript dan SockJS/STOMP.js), langkah pertama ialah mewujudkan sambungan WebSocket dan kemudian melanggan topik chat awam.
Klien menggunakan klien STOMP untuk bersambung ke titik akhir /ws dan kemudian melanggan /topic/public-chat untuk menerima semua mesej yang disiarkan.
// Assuming SockJS and STOMP.js are loaded
var socket = new SockJS('/ws'); // Connect to our WebSocket endpoint
var stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
console.log('Connected: ' + frame);
// Subscribe to the public chat topic
stompClient.subscribe('/topic/public-chat', function(message) {
var chatMessage = JSON.parse(message.body);
console.log('Received message: ' + chatMessage.content + ' from ' + chatMessage.sender);
// Update UI with the message
});
// Send a JOIN message (example)
stompClient.send("/app/chat.addUser", {}, JSON.stringify({
sender: 'User123',
type: 'JOIN'
}));
});Klien: Menghantar Mesej Chat
Setelah bersambung dan melanggan, klien boleh menghantar mesej chat kepada pelayan. Mesej ini dihantar ke destinasi aplikasi (contohnya, /app/chat.sendMessage) yang sedang didengar oleh controller Spring kita.
Pelayan kemudian memproses mesej ini dan menyiarkannya kembali kepada semua pelanggan /topic/public-chat, termasuk pengirim.
// Function to send a chat message
function sendChatMessage(senderName, messageContent) {
if (stompClient && stompClient.connected) {
var chatMessage = {
sender: senderName,
content: messageContent,
type: 'CHAT'
};
stompClient.send("/app/chat.sendMessage", {}, JSON.stringify(chatMessage));
console.log("Sent: " + chatMessage.content);
} else {
console.log("STOMP client not connected.");
}
}
// Example usage:
// sendChatMessage('Alice', 'Hello everyone!');Aliran Chat Lengkap
Mari kita gambarkan aliran lengkap untuk bilik chat awam:
- Klien Bersambung: Pelayar pengguna bersambung ke titik akhir WebSocket (
/ws). - Klien Melanggan: Klien melanggan topik awam (
/topic/public-chat) untuk menerima mesej. - Klien Menyertai: Klien menghantar mesej
JOINkepada pelayan (/app/chat.addUser). - Pelayan Menyiarkan Penyertaan: Pelayan menerima mesej
JOINdan menyiarkannya ke/topic/public-chat. Semua klien menerima pemberitahuan "pengguna telah menyertai". - Klien Menghantar Chat: Klien menghantar mesej
CHATkepada pelayan (/app/chat.sendMessage). - Pelayan Menyiarkan Chat: Pelayan menerima mesej
CHATdan menyiarkannya ke/topic/public-chat. Semua klien menerima mesej chat tersebut.
Amalan Terbaik Chat Awam
Apabila membina bilik chat awam, pertimbangkan perkara berikut untuk pengalaman pengguna dan prestasi pelayan yang lebih baik:
- Sejarah Mesej: Laksanakan cara untuk menyimpan dan mendapatkan semula mesej terdahulu bagi pengguna baharu yang menyertai bilik.
- Kehadiran Pengguna: Jejaki pengguna aktif dalam bilik (contohnya, menggunakan peta dalam memori atau pangkalan data).
- Pengehadan Kadar: Cegah spam dengan mengehadkan kekerapan pengguna boleh menghantar mesej.
- Penyederhanaan: Sediakan alat untuk penyederhana mengalih keluar mesej yang tidak sesuai atau menyekat pengguna.
- Kebolehskalaan: Untuk chat awam berskala besar, pertimbangkan broker mesej luaran seperti RabbitMQ atau Kafka.
Semakan Bilik Chat Awam
Yang manakah antara berikut benar tentang pelaksanaan bilik chat awam menggunakan Spring WebSockets dan STOMP?
Imbas Kembali: Bilik Chat Awam
Dalam pelajaran ini, anda telah mempelajari cara melaksanakan bilik chat awam berasaskan penyiaran menggunakan Spring WebSockets dan STOMP.
- Kami melihat bagaimana topik STOMP (contohnya,
/topic/public-chat) berfungsi sebagai saluran untuk bilik chat. - Anda telah mempelajari cara menggunakan
@MessageMappingdanSimpMessageSendingOperationspada pelayan untuk mengendalikan mesej masuk dan menyiarkannya. - Kami meneroka cara mengendalikan peristiwa penyertaan pengguna dan memaklumkan semua peserta.
- Akhir sekali, kami menyentuh interaksi di sisi klien dan amalan terbaik yang penting untuk aplikasi chat yang kukuh.
Seterusnya, kita akan mendalami pelaksanaan pemesejan peribadi antara dua individu!
Pelajari WebSockets dan Sistem Masa Nyata dengan Spring dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 12
- Pelajaran
- 48
Soalan Lazim
Adakah pelajaran “Melaksanakan Bilik Sembang Awam” percuma?
Ya — teks penuh “Melaksanakan Bilik Sembang Awam” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus WebSockets dan Sistem Masa Nyata dengan Spring, tingkat taraf kepada CoddyKit PRO. Kursus WebSockets dan Sistem Masa Nyata dengan Spring merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Melaksanakan Bilik Sembang Awam”?
Bangunkan fungsi supaya pengguna boleh menyertai dan mengambil bahagian dalam bilik sembang awam berbentuk siaran. Anda berlatih WebSockets dan Sistem Masa Nyata dengan Spring menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan WebSockets dan Sistem Masa Nyata dengan Spring?
Tiada pengalaman terdahulu diperlukan. Pembelajaran WebSockets dan Sistem Masa Nyata dengan Spring di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.
Berapa lamakah pelajaran “Melaksanakan Bilik Sembang Awam” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran WebSockets dan Sistem Masa Nyata dengan Spring ini?
Ya. Setiap pelajaran WebSockets dan Sistem Masa Nyata dengan Spring menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Mereka Bentuk Model Mesej Sembang
- Melaksanakan Bilik Sembang Awam
- Pemesejan Peribadi dengan STOMP
- Penunjuk Menaip dan Kehadiran Dalam Talian