客户端与服务器的基本消息传递
实现客户端向服务器以及服务器向客户端发送简单消息,展示基本的实时交互。
客户端与服务器的基本消息传递 是 CoddyKit 上的免费 WebSockets & Real-Time Systems with Spring 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 WebSockets & Real-Time Systems with Spring 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 WebSockets & Real-Time Systems with Spring 课程共包含 4 节课。
本课时的部分内容尚未翻译,以英文显示。
Messaging Fundamentals
In previous lessons, you set up your Spring WebSocket application and configured its endpoints. Now, let's make it talk!
Real-time communication is all about sending messages back and forth between clients (like web browsers) and the server. This lesson will show you the basics of how this interaction works.
Client Sends to Server
The most common interaction starts with a client sending a message to the server. This message might be a user action, a chat message, or a command.
- The client establishes a WebSocket connection.
- It then sends data to a specific server "destination".
- Spring handles receiving this message on the server side.
Server-Side Receiver (Spring)
Spring uses annotations to make handling incoming messages easy. The @MessageMapping annotation maps a method to a specific destination path, similar to @GetMapping for HTTP.
When a client sends a message to, say, /app/hello, the method annotated with @MessageMapping("/hello") will be invoked.
Implementing Server Receiver
Let's see a simple server-side method that receives a message. Notice how the input message can be directly mapped to a Java object (e.g., a String).
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.stereotype.Controller;
@Controller
public class GreetingController {
@MessageMapping("/hello")
public String handleHello(String message) {
System.out.println("Received from client: " + message);
return "Server received: " + message;
}
}Server Sends to Client
After processing a client's message, the server often needs to send a response or broadcast updates to clients. This is how real-time interaction truly happens.
Spring provides convenient ways to send messages back to clients, often using a message broker.
Implementing Server Sender
To send an immediate response to the client who sent the message, you can use the @SendTo annotation. This routes the return value of your @MessageMapping method to a specific topic.
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;
@Controller
public class GreetingController {
@MessageMapping("/hello")
@SendTo("/topic/greetings")
public String handleHello(String message) {
System.out.println("Received: " + message);
return "Hello from Server: " + message;
}
}Client-Side Sending (JavaScript)
On the client side, typically a web browser, you'll use JavaScript to interact with the WebSocket endpoint. Libraries like SockJS and STOMP.js simplify this process.
- Connect to the WebSocket endpoint.
- Send messages to the server's
@MessageMappingdestinations. - Subscribe to server "topic" destinations to receive messages.
Simple JavaScript Client
Here's how a basic JavaScript client sends a message. It uses a STOMP client to connect and send data to the server's /app/hello destination.
// This assumes SockJS and STOMP.js are loaded
var socket = new SockJS('/ws'); // Your WebSocket endpoint
var stompClient = Stomp.over(socket);
stompClient.connect({}, function (frame) {
console.log('Connected: ' + frame);
// Subscribe to a topic to receive messages
stompClient.subscribe('/topic/greetings', function (greeting) {
console.log("Received from server: " + greeting.body);
});
// Send a message to the server
stompClient.send("/app/hello", {}, "Hello Spring!");
});Full Echo Example (Server)
Let's put it together! This Spring Boot server will receive a message, print it, and then send a greeting back to a public topic. You can run this as a Spring Boot application.
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.SendTo;
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;
@SpringBootApplication
public class WebSocketServerApp {
public static void main(String[] args) {
SpringApplication.run(WebSocketServerApp.class, args);
}
}
@Configuration
@EnableWebSocketMessageBroker
class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws").withSockJS(); // WebSocket endpoint
}
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic"); // Enable a simple broker for /topic destinations
config.setApplicationDestinationPrefixes("/app"); // Client messages for @MessageMapping
}
}
@Controller
class GreetingController {
@MessageMapping("/hello") // Client sends to /app/hello
@SendTo("/topic/greetings") // Server sends response to /topic/greetings
public String greet(String message) throws Exception {
Thread.sleep(1000); // Simulate processing delay
System.out.println("Server received: " + message);
return "Server says: " + message + "!";
}
}Message Flow Check
Consider a Spring WebSocket application where a client sends a message to /app/chat and the server responds to /topic/updates. Which of the following statements are true about this interaction?
Recap: Basic Messaging
Great job! You've learned the fundamentals of client-server messaging in Spring WebSockets:
- Clients send messages to server destinations using client-side STOMP libraries.
- Servers receive messages using
@MessageMapping. - Servers can respond immediately using
@SendToto broadcast to topics.
This forms the foundation for all real-time interactions. Next, we'll dive deeper into the STOMP protocol for more structured messaging!
常见问题解答
「客户端与服务器的基本消息传递」课时是免费的吗?
是的 — 「客户端与服务器的基本消息传递」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 WebSockets & Real-Time Systems with Spring 课程的其余内容,请升级到 CoddyKit PRO。 WebSockets & Real-Time Systems with Spring 课程共包含 4 节课。
「客户端与服务器的基本消息传递」这节课中我会学到什么?
实现客户端向服务器以及服务器向客户端发送简单消息,展示基本的实时交互。 你通过在浏览器中直接运行的动手代码来练习 WebSockets & Real-Time Systems with Spring,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 WebSockets & Real-Time Systems with Spring 需要有经验吗?
无需任何先前经验。CoddyKit 上的 WebSockets & Real-Time Systems with Spring 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「客户端与服务器的基本消息传递」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 WebSockets & Real-Time Systems with Spring 课中编写并运行代码吗?
能。每节 WebSockets & Real-Time Systems with Spring 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。