use std::{collections::VecDeque, net::SocketAddr};
use anyhow::anyhow;
use rusty_tpkt::{TcpTpktConnection, TcpTpktServer, TpktConnection, TpktReader, TpktWriter};
#[tokio::main]
async fn main() -> Result<(), anyhow::Error> {
let test_address = "127.0.0.1:12345".parse()?;
let server_connect_task = tokio::task::spawn(example_server(test_address));
let client_connect_task = tokio::task::spawn(example_client(test_address));
client_connect_task.await??;
server_connect_task.await??;
Ok(())
}
async fn example_server(address: SocketAddr) -> Result<(), anyhow::Error> {
let server = TcpTpktServer::listen(address.clone()).await?;
let connection = server.accept().await?;
let (mut reader, mut writer) = connection.split().await?;
let data = reader.recv().await?.ok_or_else(|| anyhow!("Connection Closed"))?;
assert_eq!(data, "Hello from the client!".as_bytes().to_vec());
let mut data = VecDeque::new();
data.push_back("Hello from the server!".as_bytes().to_vec());
while data.len() > 0 {
writer.send(&mut data).await?;
}
Ok(())
}
async fn example_client(address: SocketAddr) -> Result<(), anyhow::Error> {
let connection = TcpTpktConnection::connect(address).await?;
let (mut reader, mut writer) = connection.split().await?;
let mut data = VecDeque::new();
data.push_back("Hello from the client!".as_bytes().to_vec());
while data.len() > 0 {
writer.send(&mut data).await?;
}
let data = reader.recv().await?.ok_or_else(|| anyhow!("Connection Closed"))?;
assert_eq!(data, "Hello from the server!".as_bytes().to_vec());
Ok(())
}