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 listeners = new ArrayList<>();

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);
}

}

posted @ 2025-03-06 21:20  李蕊lr  阅读(29)  评论(0)    收藏  举报