在Java服务器小程序中实现消息推送,可以采用以下几种常见的方法:
WebSocket是一种在单个TCP连接上进行全双工通信的协议。它允许服务器主动向客户端推送数据。
引入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
配置WebSocket:
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.setApplicationDestinationPrefixes("/app");
registry.enableSimpleBroker("/topic");
}
}
创建控制器:
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;
@Controller
public class MessageController {
@MessageMapping("/send")
@SendTo("/topic/messages")
public String sendMessage(String message) {
return message;
}
}
客户端代码:
var socket = new SockJS('/ws');
var stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
stompClient.subscribe('/topic/messages', function(message) {
console.log(message.body);
});
});
function sendMessage() {
stompClient.send("/app/send", {}, "Hello, World!");
}
Server-Sent Events是一种允许服务器向浏览器推送实时更新的技术。
创建控制器:
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@RestController
public class SseController {
private final ExecutorService executorService = Executors.newCachedThreadPool();
@GetMapping(path = "/events", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public SseEmitter handle() {
SseEmitter emitter = new SseEmitter();
executorService.submit(() -> {
try {
for (int i = 0; i < 10; i++) {
emitter.send(SseEmitter.event().data("Message " + i));
Thread.sleep(1000);
}
} catch (IOException | InterruptedException e) {
emitter.completeWithError(e);
}
});
return emitter;
}
}
客户端代码:
var eventSource = new EventSource("/events");
eventSource.onmessage = function(event) {
console.log(event.data);
};
Long Polling是一种通过客户端不断发送请求到服务器,服务器在有新数据时立即响应的技术。
创建控制器:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
@RestController
public class LongPollingController {
private final BlockingQueue<String> queue = new LinkedBlockingQueue<>();
public LongPollingController() {
// Simulate adding messages to the queue
new Thread(() -> {
try {
for (int i = 0; i < 10; i++) {
queue.put("Message " + i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}).start();
}
@GetMapping("/poll")
public String poll() throws InterruptedException {
return queue.take();
}
}
客户端代码:
function poll() {
fetch('/poll')
.then(response => response.text())
.then(data => {
console.log(data);
poll(); // Poll again
});
}
poll();
选择哪种方法取决于具体的需求和应用场景。WebSocket适用于需要双向通信的场景,SSE适用于服务器向客户端单向推送数据的场景,而Long Polling则是一种较为传统的实现方式,适用于不支持WebSocket和SSE的环境。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。