鍍金池/ 教程/ Java/ 網(wǎng)絡(luò)模塊:W貓的回音
標準輸入與輸出
消息傳遞
循環(huán)
注釋
Rust for Mac OS
幾種智能指針
Cell, RefCell
trait對象 (trait object)
rust web 開發(fā)
Unsafe、原始指針
Macro
迭代器
函數(shù)
Borrow, BorrowMut, ToOwned
快速上手
二叉樹
編輯器
測試與評測
Deref
安裝Rust
哈希表 HashMap
原生類型
17.錯誤處理
VS Code 安裝配置
動態(tài)數(shù)組Vec
模式匹配
操作符和格式化字符串
Rust for Linux
函數(shù)參數(shù)
Visual Studio
vim/GVim安裝配置
閉包作為參數(shù)和返回值
安全(Safety)
Cow
生命周期( Lifetime )
閉包的實現(xiàn)
所有權(quán)(Ownership)
Atom
將Rust編譯成庫
類型、運算符和字符串
類型系統(tǒng)中的幾個常見 trait
特性
屬性和編譯器參數(shù)
Spacemacs
集合類型
Rust json處理
Heap & Stack
并行
標準庫示例
基本程序結(jié)構(gòu)
鏈表
trait 和 trait對象
前期準備
代碼風(fēng)格
編譯器參數(shù)
基于語義化版本的項目版本聲明與管理
Rust 版本管理工具: rustup
引用&借用(References&Borrowing)
注釋與文檔
10.1 trait關(guān)鍵字
模式
調(diào)用ffi函數(shù)
unsafe
并發(fā),并行,多線程編程
AsRef 和 AsMut
Rust旅程
Rust for Windows
結(jié)構(gòu)體與枚舉
條件分支
附錄I-術(shù)語表
變量綁定與原生類型
Mutex 與 RwLock
泛型
裸指針
常用數(shù)據(jù)結(jié)構(gòu)實現(xiàn)
系統(tǒng)命令:調(diào)用grep
Into/From 及其在 String 和 &str 互轉(zhuǎn)上的應(yīng)用
共享內(nèi)存
Sublime
網(wǎng)絡(luò)模塊:W貓的回音
函數(shù)返回值
包和模塊
高階函數(shù)
函數(shù)與方法
match關(guān)鍵字
隊列
目錄操作:簡單grep
語句和表達式
并發(fā)編程
閉包
測試
閉包的語法
同步
迭代器
String
Send 和 Sync
Rc 和 Arc
屬性
Emacs
優(yōu)先隊列
Prelude
cargo簡介
控制流(control flow)
數(shù)組、動態(tài)數(shù)組和字符串
FFI
模塊和包系統(tǒng)、Prelude
實戰(zhàn)篇
Rust 是一門系統(tǒng)級編程語言,被設(shè)計為保證內(nèi)存和線程安全,并防止段錯誤。作為系統(tǒng)級編程語言,它的基本理念是 “零開銷抽象”。理
運算符重載
Any和反射
rust數(shù)據(jù)庫操作
輸入輸出流
復(fù)合類型
性能測試

網(wǎng)絡(luò)模塊:W貓的回音

本例子中,W貓將帶大家寫一個大家都寫過但是沒什么人用過的TCP ECHO軟件,作為本章的結(jié)尾。本程序僅作為實例程序,我個人估計也沒有人在實際的生活中去使用她。不過,作為標準庫的示例來說,已經(jīng)足夠。

首先,我們需要一個一個服務(wù)器端。

fn server<A: ToSocketAddrs>(addr: A) -> io::Result<()> {
    // 建立一個監(jiān)聽程序
    let listener = try!(TcpListener::bind(&addr)) ;
    // 這個程序一次只需處理一個鏈接就好
    for stream in listener.incoming() {
        // 通過match再次解包 stream到
        match stream {
            // 這里匹配的重點是如何將一個mut的匹配傳給一個Result
            Ok(mut st) => {
                // 我們總是要求client端先發(fā)送數(shù)據(jù)
                // 準備一個超大的緩沖區(qū)
                // 當然了,在實際的生活中我們一般會采用環(huán)形緩沖來重復(fù)利用內(nèi)存。
                // 這里僅作演示,是一種很低效的做法
                let mut buf: Vec<u8> = vec![0u8; 1024];
                // 通過try!方法來解包
                // try!方法的重點是需要有特定的Error類型與之配合
                let rcount = try!(st.read(&mut buf));
                // 只輸出緩沖區(qū)里讀取到的內(nèi)容
                println!("{:?}", &buf[0..rcount]);
                // 回寫內(nèi)容
                let wcount = try!(st.write(&buf[0..rcount]));
                // 以下代碼實際上算是邏輯處理
                // 并非標準庫的一部分了
                if rcount != wcount {
                    panic!("Not Fully Echo!, r={}, w={}", rcount, wcount);
                }
                // 清除掉已經(jīng)讀到的內(nèi)容
                buf.clear();
            }
            Err(e) => {
                panic!("{}", e);
            }
        }
    }
    // 關(guān)閉掉Serve端的鏈接
    drop(listener);
    Ok(())
}

然后,我們準備一個模擬TCP短鏈接的客戶端:

fn client<A: ToSocketAddrs>(addr: A) -> io::Result<()> {

    let mut buf = vec![0u8;1024];
    loop {
        // 對比Listener,TcpStream就簡單很多了
        // 本次模擬的是tcp短鏈接的過程,可以看作是一個典型的HTTP交互的基礎(chǔ)IO模擬
        // 當然,這個通訊里面并沒有HTTP協(xié)議 XD!
        let mut stream = TcpStream::connect(&addr).unwrap();
        let msg = "WaySLOG comming!".as_bytes();
        // 避免發(fā)送數(shù)據(jù)太快而刷屏
        thread::sleep_ms(100);
        let rcount = try!(stream.write(&msg));
        let _ = try!(stream.read(&mut buf));
        println!("{:?}", &buf[0..rcount]);
        buf.clear();
    }
    Ok(())
}

將我們的程序拼接起來如下:

use std::net::*;
use std::io;
use std::io::{Read, Write};
use std::env;
use std::thread;

fn server<A: ToSocketAddrs>(addr: A) -> io::Result<()> { .. }

fn client<A: ToSocketAddrs>(addr: A) -> io::Result<()> { .. }

fn main() {
    let mut args = env::args();
    args.next();
    let action = args.next().unwrap();
    if action == "s" {
        server(&args.next().unwrap()).unwrap();
    } else {
        client(&args.next().unwrap()).unwrap();
    }
}

各位可以自己試一下結(jié)果

寫網(wǎng)絡(luò)程序,注定了要處理各種神奇的條件和錯誤,定義自己的數(shù)據(jù)結(jié)構(gòu),粘包問題等都是需要我們?nèi)ヌ幚砗完P(guān)注的。相較而言,Rust本身在網(wǎng)絡(luò)方面的基礎(chǔ)設(shè)施建設(shè)并不盡如人意,甚至連網(wǎng)絡(luò)I/O都只提供了如上的block I/O ??赡芷鋱F隊更關(guān)注于語言基礎(chǔ)語法特性和編譯的改進,但其實,有著官方出品的這種網(wǎng)絡(luò)庫是非常重要的。同時,我也希望Rust能夠涌現(xiàn)出更多的網(wǎng)絡(luò)庫方案,讓Rust的明天更好更光明。