Skip to content

Instantly share code, notes, and snippets.

@FredrikNoren
Created August 11, 2021 11:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save FredrikNoren/44cc2643a705571e699d06f8eb843b96 to your computer and use it in GitHub Desktop.
Save FredrikNoren/44cc2643a705571e699d06f8eb843b96 to your computer and use it in GitHub Desktop.
Client code:
let mut buff = [0; 65000];
log::info!("Handshaking");
let (mut send, mut recv) = connection.connection.open_bi().await.unwrap();
send.write_all(b"hello").await.unwrap();
recv.read(&mut buff).await.unwrap(); // Discard hello message
log::info!("Synchronizing time");
let time = Instant::now();
send.write_all(b"req-time").await.unwrap();
log::info!("Waiting for server time");
let size = recv.read(&mut buff).await.unwrap().unwrap();
let roundtrip = time.elapsed();
let msg: MsgRespTime = bincode::deserialize(&buff[0..size]).unwrap();
log::info!("Got server time: {}", msg.server_time_ms);
let local_time = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_millis();
let server_time = msg.server_time_ms + roundtrip.as_millis() / 2;
let server_time_offset = (server_time as i128 - local_time as i128) as i64;
log::info!("Server time offset: {} ms", server_time_offset);
log::info!("Receiving game state snapshot");
let size = recv.read(&mut buff).await.unwrap().unwrap();
let msg: MsgConnected = bincode::deserialize(&buff[0..size]).unwrap();
Server code:
log::info!("[{}] Handshaking", self_player_id);
let (mut send, mut recv) = connection.bi_streams.next().await.unwrap().unwrap();
send.write_all(b"hello").await.unwrap();
recv.read(&mut buff).await.unwrap(); // Discard hello message
log::info!("[{}] Synchronizing time", self_player_id);
recv.read(&mut buff).await.unwrap(); // Discard req time message
log::info!("[{}] Sending time", self_player_id);
let local_time = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_millis();
send.write_all(&bincode::serialize(&MsgRespTime { server_time_ms: local_time }).unwrap()).await.unwrap();
log::info!("[{}] Sending game state snapshot", self_player_id);
let msg = bincode::serialize(&MsgConnected {
self_player_id: self_player_id.clone(),
game_state: game_states_snapshot
}).unwrap();
send.write_all(&msg).await.unwrap();
send.finish().await.unwrap();
log::info!("[{}] Connected message sent", self_player_id);
Client output:
[2021-08-11T11:42:25Z INFO forge] Handshaking
[2021-08-11T11:42:25Z INFO forge] Synchronizing time
[2021-08-11T11:42:25Z INFO forge] Waiting for server time
[2021-08-11T11:42:25Z INFO forge] Got server time: 1628682145397
[2021-08-11T11:42:25Z INFO forge] Server time offset: 0 ms
[2021-08-11T11:42:25Z INFO forge] Receiving game state snapshot
thread 'tokio-runtime-worker' panicked at 'called `Option::unwrap()` on a `None` value', forge/src/main.rs:219:56
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Server output:
[2021-08-11T11:42:25Z INFO forge_server] [0] Connected 127.0.0.1:18009
[2021-08-11T11:42:25Z INFO forge_server] [0] Handshaking
[2021-08-11T11:42:25Z INFO forge_server] [0] Synchronizing time
[2021-08-11T11:42:25Z INFO forge_server] [0] Sending time
[2021-08-11T11:42:25Z INFO forge_server] [0] Sending game state snapshot
[2021-08-11T11:42:25Z INFO forge_server] [0] Connected message sent
[2021-08-11T11:42:25Z INFO forge_server] [0] Creating streams
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment