ws モジュールを使用する
https://docs.rs/axum/latest/axum/extract/ws/index.html
#[tokio::main] async fn main() { let app = Router::new().route("/ws", any(handler)); // Start the server let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); axum::serve(listener, app.into_make_service_with_connect_info::<SocketAddr>()).await.unwrap(); } async fn handler(ConnectInfo(addr): ConnectInfo<SocketAddr>, ws: WebSocketUpgrade) -> Response { println!("{}", addr); ws.on_upgrade(handle_socket) } async fn handle_socket(mut socket: WebSocket) { while let Some(msg) = socket.recv().await { let mut msg = if let Ok(msg) = msg { msg } else { return; }; if socket.send(msg).await.is_err() { // client disconnected return; } } }
クライアントサイド
<textarea id="output" cols="50" rows="10" readonly></textarea><br> <input type="text" id="input" placeholder="Type a message" /> <button onclick="sendMessage()">Send</button> <script> const ws = new WebSocket("ws://192.168.33.10:3000/ws"); const output = document.getElementById("output"); const input = document.getElementById("input"); input.value = "hello"; ws.onmessage = (event) => { output.value += `\n${event.data}`; }; function sendMessage() { const message = input.value; ws.send(message); input.value = ""; } </script>
axumでも問題なくできることがわかりました。
なるほど、ちょっと理解しました。