3.6
一、后端 WebSocket 配置
在 Spring Boot 中启用 WebSocket,实现客户端实时通信:
java
// WebSocket配置类
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(messageHandler(), "/ws/message")
.setAllowedOrigins("*"); // 开发环境允许所有来源
}
@Bean
public WebSocketHandler messageHandler() {
return new TextWebSocketHandler() {
private final Set<WebSocketSession> sessions = Collections.synchronizedSet(new HashSet<>());
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
sessions.add(session);
System.out.println("新客户端连接:" + session.getId());
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
sessions.remove(session);
System.out.println("客户端断开:" + session.getId());
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
String payload = message.getPayload();
System.out.println("收到消息:" + payload);
// 广播消息给所有客户端
for (WebSocketSession s : sessions) {
if (s.isOpen()) {
s.sendMessage(new TextMessage("服务器响应:" + payload));
}
}
}
};
}
}
// 消息发送API
@RestController
@RequestMapping("/api/msg")
public class MessageController {
@Autowired
private WebSocketHandler messageHandler;
@PostMapping("/push")
public ResponseEntity<String> pushMessage(@RequestBody String message) {
// 实际项目中可能需要根据用户ID定向推送
messageHandler.broadcastMessage(message);
return ResponseEntity.ok("消息推送成功");
}
}
二、Android 端 WebSocket 实现
使用 OkHttp 的 WebSocket 接口连接后端:
java
public class WebSocketManager {
private static final String WS_URL = "ws://192.168.1.100:8080/ws/message";
private static WebSocketManager instance;
private WebSocket webSocket;
private final OkHttpClient client;
private List
private WebSocketManager() {
client = new OkHttpClient.Builder()
.readTimeout(0, TimeUnit.MILLISECONDS) // 长连接不超时
.build();
}
public static WebSocketManager getInstance() {
if (instance == null) {
instance = new WebSocketManager();
}
return instance;
}
public void connect() {
Request request = new Request.Builder()
.url(WS_URL)
.build();
client.newWebSocket(request, new WebSocketListener() {
@Override
public void onOpen(WebSocket webSocket, Response response) {
WebSocketManager.this.webSocket = webSocket;
Log.d("WebSocket", "连接成功");
for (OnMessageListener listener : listeners) {
listener.onConnected();
}
}
@Override
public void onMessage(WebSocket webSocket, String text) {
Log.d("WebSocket", "收到消息:" + text);
for (OnMessageListener listener : listeners) {
listener.onMessage(text);
}
}
@Override
public void onClosing(WebSocket webSocket, int code, String reason) {
Log.d("WebSocket", "连接关闭:" + reason);
for (OnMessageListener listener : listeners) {
listener.onClosed();
}
}
@Override
public void onFailure(WebSocket webSocket, Throwable t, Response response) {
Log.e("WebSocket", "连接失败", t);
for (OnMessageListener listener : listeners) {
listener.onError(t.getMessage());
}
}
});
}
public void sendMessage(String message) {
if (webSocket != null && webSocket.isOpen()) {
webSocket.send(message);
}
}
public void addOnMessageListener(OnMessageListener listener) {
listeners.add(listener);
}
public void removeOnMessageListener(OnMessageListener listener) {
listeners.remove(listener);
}
public interface OnMessageListener {
void onConnected();
void onMessage(String message);
void onClosed();
void onError(String error);
}
}
三、应用场景示例
在 Android Activity 中集成:
java
@Override
protected void onCreate(Bundle savedInstanceState) {
WebSocketManager.getInstance().addOnMessageListener(new WebSocketManager.OnMessageListener() {
@Override
public void onConnected() {
runOnUiThread(() -> Toast.makeText(MainActivity.this, "WebSocket连接成功", Toast.LENGTH_SHORT).show());
}
@Override
public void onMessage(String message) {
runOnUiThread(() -> {
// 更新UI显示消息
tvMessage.setText(message);
});
}
// 其他回调方法省略...
});
WebSocketManager.getInstance().connect();
}
后端主动推送消息:
java
// 假设在订单服务中,订单状态变更时推送消息
@Service
public class OrderService {
@Autowired
private MessageController messageController;
public void updateOrderStatus(Long orderId, String status) {
// 更新订单状态...
String message = "订单 " + orderId + " 状态已更新为:" + status;
messageController.pushMessage(message);
}
}

浙公网安备 33010602011771号