pub struct AsyncClient { /* private fields */ }Expand description
Async tcp connection builder
async version of crate::tcp::Client,
require tokio async runtime
Implementations§
Source§impl Client
impl Client
Sourcepub fn new(
server_addr: &str,
id: &str,
local_addr: Option<SocketAddr>,
) -> Result<Self>
pub fn new( server_addr: &str, id: &str, local_addr: Option<SocketAddr>, ) -> Result<Self>
set rendezvous server, peer identity, local bind address. if no local address set, choose according server address type(ipv4 or ipv6).
Examples found in repository?
12async fn main() -> Result<(), Box<dyn Error>> {
13 let server_addr = "127.0.0.1:8888";
14
15 {
16 let server_addr = server_addr.clone();
17 spawn(async move { Server::new(server_addr).await?.run().await });
18 }
19
20 let t = {
21 let server_addr = server_addr.clone();
22 spawn(async move {
23 let mut c = AsyncClient::new(server_addr, "c1", None).unwrap();
24 loop {
25 match c.listen().await {
26 Ok(_) => {
27 let (mut s, _) = c.accept().await.unwrap();
28 s.write(b"hello").await.unwrap();
29 break;
30 }
31 _ => {
32 sleep(Duration::from_secs(1)).await;
33 continue;
34 }
35 }
36 }
37 })
38 };
39
40 let mut c = AsyncClient::new(server_addr, "c2", None)?;
41 let mut s = loop {
42 match c.connect("c1").await {
43 Ok(s) => break s,
44 _ => sleep(Duration::from_secs(1)).await,
45 }
46 };
47
48 let mut buf = [0u8; 5];
49 s.read(&mut buf).await?;
50
51 t.await?;
52
53 Ok(())
54}Sourcepub fn as_socket(&self) -> Option<&TcpListener>
pub fn as_socket(&self) -> Option<&TcpListener>
expose TcpListener
Sourcepub async fn connect(&mut self, target_id: &str) -> Result<TcpStream>
pub async fn connect(&mut self, target_id: &str) -> Result<TcpStream>
connect to rendezvous server and request a connection to target node.
it will return a TcpStream with remote peer.
the connection with rendezvous server will be drop after return.
Examples found in repository?
12async fn main() -> Result<(), Box<dyn Error>> {
13 let server_addr = "127.0.0.1:8888";
14
15 {
16 let server_addr = server_addr.clone();
17 spawn(async move { Server::new(server_addr).await?.run().await });
18 }
19
20 let t = {
21 let server_addr = server_addr.clone();
22 spawn(async move {
23 let mut c = AsyncClient::new(server_addr, "c1", None).unwrap();
24 loop {
25 match c.listen().await {
26 Ok(_) => {
27 let (mut s, _) = c.accept().await.unwrap();
28 s.write(b"hello").await.unwrap();
29 break;
30 }
31 _ => {
32 sleep(Duration::from_secs(1)).await;
33 continue;
34 }
35 }
36 }
37 })
38 };
39
40 let mut c = AsyncClient::new(server_addr, "c2", None)?;
41 let mut s = loop {
42 match c.connect("c1").await {
43 Ok(s) => break s,
44 _ => sleep(Duration::from_secs(1)).await,
45 }
46 };
47
48 let mut buf = [0u8; 5];
49 s.read(&mut buf).await?;
50
51 t.await?;
52
53 Ok(())
54}Sourcepub async fn listen(&mut self) -> Result<()>
pub async fn listen(&mut self) -> Result<()>
put socket in listen mode, create connection with rendezvous server, wait for peer connection request. if connection with server broken it will auto reconnect.
when received Fsync request from server, attempt to connect remote peer with a very short timeout,
this will open the firwall and nat rule for the peer connection that will follow immediately.
When the peer connection finally come, the listening socket then accept it as normal.
Examples found in repository?
12async fn main() -> Result<(), Box<dyn Error>> {
13 let server_addr = "127.0.0.1:8888";
14
15 {
16 let server_addr = server_addr.clone();
17 spawn(async move { Server::new(server_addr).await?.run().await });
18 }
19
20 let t = {
21 let server_addr = server_addr.clone();
22 spawn(async move {
23 let mut c = AsyncClient::new(server_addr, "c1", None).unwrap();
24 loop {
25 match c.listen().await {
26 Ok(_) => {
27 let (mut s, _) = c.accept().await.unwrap();
28 s.write(b"hello").await.unwrap();
29 break;
30 }
31 _ => {
32 sleep(Duration::from_secs(1)).await;
33 continue;
34 }
35 }
36 }
37 })
38 };
39
40 let mut c = AsyncClient::new(server_addr, "c2", None)?;
41 let mut s = loop {
42 match c.connect("c1").await {
43 Ok(s) => break s,
44 _ => sleep(Duration::from_secs(1)).await,
45 }
46 };
47
48 let mut buf = [0u8; 5];
49 s.read(&mut buf).await?;
50
51 t.await?;
52
53 Ok(())
54}Sourcepub async fn accept(&mut self) -> Result<(TcpStream, SocketAddr)>
pub async fn accept(&mut self) -> Result<(TcpStream, SocketAddr)>
accept remote peer connection
Examples found in repository?
12async fn main() -> Result<(), Box<dyn Error>> {
13 let server_addr = "127.0.0.1:8888";
14
15 {
16 let server_addr = server_addr.clone();
17 spawn(async move { Server::new(server_addr).await?.run().await });
18 }
19
20 let t = {
21 let server_addr = server_addr.clone();
22 spawn(async move {
23 let mut c = AsyncClient::new(server_addr, "c1", None).unwrap();
24 loop {
25 match c.listen().await {
26 Ok(_) => {
27 let (mut s, _) = c.accept().await.unwrap();
28 s.write(b"hello").await.unwrap();
29 break;
30 }
31 _ => {
32 sleep(Duration::from_secs(1)).await;
33 continue;
34 }
35 }
36 }
37 })
38 };
39
40 let mut c = AsyncClient::new(server_addr, "c2", None)?;
41 let mut s = loop {
42 match c.connect("c1").await {
43 Ok(s) => break s,
44 _ => sleep(Duration::from_secs(1)).await,
45 }
46 };
47
48 let mut buf = [0u8; 5];
49 s.read(&mut buf).await?;
50
51 t.await?;
52
53 Ok(())
54}