udp_client/
udp_client.rs

1use std::{sync::Arc, time::Duration};
2
3use kcp_sys::{
4    endpoint::*,
5    packet_def::{Bytes, BytesMut},
6    stream::KcpStream,
7};
8use tokio::{
9    io::{AsyncReadExt, AsyncWriteExt},
10    net::UdpSocket,
11};
12
13#[tokio::main]
14async fn main() {
15    let mut endpoint = KcpEndpoint::new();
16    endpoint.run().await;
17
18    let (input, mut output) = (endpoint.input_sender(), endpoint.output_receiver().unwrap());
19
20    let udp_socket = Arc::new(UdpSocket::bind("0.0.0.0:54320").await.unwrap());
21    udp_socket.connect("127.0.0.1:54321").await.unwrap();
22
23    let udp = udp_socket.clone();
24    tokio::spawn(async move {
25        while let Some(data) = output.recv().await {
26            udp.send(&data.inner()).await.unwrap();
27        }
28    });
29
30    let udp = udp_socket.clone();
31    tokio::spawn(async move {
32        loop {
33            let mut buf = vec![0; 1024];
34            let (size, _) = udp.recv_from(&mut buf).await.unwrap();
35            input
36                .send(BytesMut::from(&buf[..size]).into())
37                .await
38                .unwrap();
39        }
40    });
41
42    loop {
43        let conn_id = endpoint
44            .connect(Duration::from_secs(1), 0, 0, Bytes::new())
45            .await
46            .unwrap();
47
48        let mut kcp_stream = KcpStream::new(&endpoint, conn_id).unwrap();
49        kcp_stream.write_all(b"hello world").await.unwrap();
50        kcp_stream.flush().await.unwrap();
51
52        let mut buf = vec![0; 64 * 1024];
53        let size = kcp_stream.read(&mut buf).await.unwrap();
54
55        println!("{}", String::from_utf8_lossy(&buf[..size]));
56        tokio::time::sleep(Duration::from_secs(1)).await;
57    }
58}