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,スゴくいいですね! 🦀