use std::io;
use fastnet::tcp::{HybridSocket, HybridEvent, TransportMode};
#[tokio::main]
async fn main() -> io::Result<()> {
println!("╔════════════════════════════════════════╗");
println!("║ FastNet Hybrid Client ║");
println!("╚════════════════════════════════════════╝");
println!();
let server_addr = "127.0.0.1:7778";
println!("Connecting to: {}", server_addr);
println!("(Attempting UDP first, TCP fallback if needed)");
println!();
let mut socket = HybridSocket::connect(server_addr).await?;
match socket.transport_mode() {
TransportMode::Udp => {
println!("✅ Connected via UDP (optimal latency)");
}
TransportMode::Tcp => {
println!("⚠️ Connected via TCP (fallback mode)");
println!(" UDP may be blocked by firewall");
}
}
println!("Session ID: {}", socket.session_id());
println!();
for i in 1..=5 {
let message = format!("Test message #{}", i);
println!("📤 Sending: {}", message);
socket.send(0, message.into_bytes()).await?;
tokio::time::sleep(tokio::time::Duration::from_millis(100)).await;
for event in socket.poll().await? {
match event {
HybridEvent::Data(_, channel, data) => {
let response = String::from_utf8_lossy(&data);
println!("📨 Received [ch{}]: {}", channel, response);
}
HybridEvent::Disconnected(_) => {
println!("❌ Disconnected from server");
return Ok(());
}
HybridEvent::TransportChanged(mode) => {
println!("🔄 Transport changed to: {:?}", mode);
}
_ => {}
}
}
}
println!();
println!("✅ Test completed successfully!");
Ok(())
}