2022/09/12
はじめに
Rust における TCP クライアントの使い方を解説する.
サーバについてはこちら.
コード全文
Cargo.toml
[package]
name = "tcp_echo_client"
version = "0.1.0"
edition = "2021"
[dependencies]
tokio = { version = "1.21", features = ["full"]}
main.rs
use tokio::{
io::{AsyncReadExt, AsyncWriteExt},
net::TcpStream,
};
#[tokio::main]
async fn main() -> std::io::Result<()> {
let addr = "0.0.0.0:8080";
let mut stream = TcpStream::connect(addr).await?;
let msg = "Hello Tokio Socket".to_string();
stream.write(msg.as_bytes()).await?;
let mut buf = Vec::with_capacity(4096);
stream.read_buf(&mut buf).await?;
let received = String::from_utf8(buf).unwrap();
println!("{}", received);
Ok(())
}
解説
パッケージ
use tokio::{
io::{AsyncReadExt, AsyncWriteExt},
net::TcpStream,
};
main
#[tokio::main]
を使う.
?
を使うために戻り地はstd::io::Result<()>
とした.
#[tokio::main]
async fn main() -> std::io::Result<()> {
接続
addr
は変数にしなくてもよいが,ここでは変数にしておいた."try to connect {addr}"
などでログを残すと,実行時にミスに気づきやすかったりする.
TcpStream::connect()
により,接続する.
let addr = "0.0.0.0:8080";
let mut stream = TcpStream::connect(addr).await?;
送信
msg
はString
型であるので,それを&[u8]
にするために.as_bytes()
を使った.
let msg = "Hello Tokio Socket".to_string();
stream.write(msg.as_bytes()).await?;
受信
buf
を定義し,そこに読み取り結果を記録する.
let mut buf = Vec::with_capacity(4096);
stream.read_buf(&mut buf).await?;
受信結果を変換・出力
String::from_utf8()
により,読み取ったbuf
を文字列に変換する.
let received = String::from_utf8(buf).unwrap();
println!("{}", received);
プログラムの終了
Ok(())
}
おわりに
Rust,スゴくいいですね! 🦀