在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

在服務器端使用內存來存儲客戶端發送過來的數據

工程師鄧生 ? 來源:coding到燈火闌珊 ? 作者:李明 ? 2022-09-29 10:03 ? 次閱讀

在這篇文章中,我們將在服務器端使用內存來存儲客戶端發送過來的數據。在實現數據存儲之前,我們先在客戶端使用Clap庫來解析命令行參數,并封裝成命令發送給服務器。

Clap解析命令行參數 在Cargo.toml文件中加入clap依賴:

clap = {version = "3.1", features = ["derive"]}

在src目錄下新建args.rs文件,寫入以下代碼:
 1useclap::Parser;
 2
 3#[derive(Debug,Parser)]
 4#[clap(name="kv_client")]
 5pubenumClientArgs{
 6Get{
 7#[clap(long)]
 8key:String,
 9},
10Set{
11#[clap(long)]
12key:String,
13#[clap(long)]
14value:String,
15},
16Publish{
17#[clap(long)]
18topic:String,
19#[clap(long)]
20value:String,
21},
22Subscribe{
23#[clap(long)]
24topic:String,
25},
26Unsubscribe{
27#[clap(long)]
28topic:String,
29#[clap(long)]
30id:u32,
31}
32}
在src/lib.rs中加入以下代碼:
1modargs;
2pubuseargs::*;
修改src/bin/kv_client.rs代碼:
 1#[tokio::main]
 2asyncfnmain()->Result<(),?Box>{
 3......
 4
 5letclient_args=ClientArgs::parse();
 6
 7//解析命令行參數,生成命令
 8letcmd=process_args(client_args).await?;
 9//命令編碼
10cmd.encode(&mutbuf).unwrap();
11//發送命令
12stream.send(buf.freeze()).await.unwrap();
13info!("Send command successed!");
14
15loop{
16tokio::select!{
17Some(Ok(buf))=stream.next()=>{
18letcmd_res=CmdResponse::decode(&buf[..]).unwrap();
19info!("Receivearesponse:{:?}",cmd_res);
20}
21}
22}
23}
 1//生成CmdRequest命令
 2asyncfnprocess_args(client_args:ClientArgs)->Result>{
 3matchclient_args{
 4//生成GET命令
 5ClientArgs::Get{key}=>{
 6Ok(CmdRequest::get(key))
 7},
 8//生成SET命令
 9ClientArgs::Set{key,value}=>{
10Ok(CmdRequest::set(key,value.into()))
11},
12//生成PUBLISH命令
13ClientArgs::Publish{topic,value}=>{
14Ok(CmdRequest::publish(topic,value.into()))
15},
16//生成SUBSCRIBE命令
17ClientArgs::Subscribe{topic}=>{
18Ok(CmdRequest::subscribe(topic))
19},
20//生成UNSUBSCRIBE命令
21ClientArgs::Unsubscribe{topic,id}=>{
22Ok(CmdRequest::unsubscribe(topic,id))
23}
24}
25}

打開一個終端,啟動kv_sever。打開另一個終端執行以下命令來測試客戶端:

RUST_LOG=info cargo run --bin kv_client get --key mykeyRUST_LOG=info cargo run --bin kv_client set --key mykey --value myvalue

服務器和客戶端都正常處理了收到的請求和響應。

內存存儲

我們使用dashmap crate在內存中存儲數據,dashmap是一個快速的并發map。

我們先創建src/storage目錄,再創建src/storage/mod.rs文件,然后在src/lib.rs文件中引入storage模塊。

在src/storage/mod.rs文件中定義一個storage trait,以便于以后不同存儲方式的擴展,代碼如下:

1usestd::Error;
2
3usebytes::Bytes;
4
5pubtraitStorage{
6fnget(&self,key:&str)->Result,Box>;
7fnset(&self,key:&str,value:Bytes)->Result<(),?Box>;
8}

在src/storage目錄下創建mem_storage.rs文件:

 1#[derive(Clone,Debug,Default)]
 2pubstructMemStorage{
 3map:DashMap
 4}
 5
 6implMemStorage{
 7pubfnnew()->Self{
 8Self{
 9map:Default::default(),
10}
11}
12}
13
14implStorageforMemStorage{
15fnget(&self,key:&str)->Result,Box>{
16Ok(self.map.get(key).map(|v|v.value().clone()))
17}
18
19fnset(&self,key:&str,value:Bytes)->Result,Box>{
20self.map.insert(key.to_string(),value.clone());
21Ok(Some(value))
22}
23}

修改kv_server.rs代碼:

 1asyncfnmain()->Result<(),?Box>{
 2......
 3
 4//初始化內存存儲
 5letstorage=Arc::new(MemStorage::new());
 6
 7loop{
 8......
 9
10letstor=storage.clone();
11
12tokio::spawn(asyncmove{
13//使用Frame的LengthDelimitedCodec進行編解碼操作
14letmutstream=Framed::new(stream,LengthDelimitedCodec::new());
15whileletSome(Ok(mutbuf))=stream.next().await{
16//對客戶端發來的protobuf請求命令進行拆包
17letcmd_req=CmdRequest::decode(&buf[..]).unwrap();
18info!("Receiveacommand:{:?}",cmd_req);
19
20//處理請求命令
21letcmd_res=process_cmd(cmd_req,&stor).await.unwrap();
22
23buf.clear();
24
25//對protobuf的請求響應進行封包,然后發送給客戶端。
26cmd_res.encode(&mutbuf).unwrap();
27stream.send(buf.freeze()).await.unwrap();
28}
29info!("Client{:?}disconnected",addr);
30});
31}
32}
33
34//處理請求命令,返回Response
35asyncfnprocess_cmd(req:CmdRequest,storage:&MemStorage)->Result>{
36matchreq{
37//處理GET命令
38CmdRequest{
39req_data:Get(Get{key})),
40}=>{
41letvalue=storage.get(&key)?;
42Ok(CmdResponse::new(200,"getsuccess".to_string(),value.unwrap_or_default()))
43},
44//處理SET命令
45CmdRequest{
46req_data:Set(Set{key,value})),
47}=>{
48letvalue=storage.set(&key,value)?;
49Ok(CmdResponse::new(200,"setsuccess".to_string(),value.unwrap_or_default()))
50},
51_=>Err("Invalidcommand".into())
52}
53}

測試

1,打開一個終端,運行kv_server:

RUST_LOG=info cargo run --bin kv_server

2,打開一個終端,運行kv_client,執行set命令:

RUST_LOG=info cargo run --bin kv_client set --key mykey --value myvalue

3,打開一個終端,運行kv_client,執行get命令:
RUST_LOG=info cargo run --bin kv_client get --key mykey

執行結果:

INFO kv_client: Send command successed!

INFO kv_client: Receive a response: CmdResponse { status: 200, message: "get success", value: b"myvalue" }




審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 服務器
    +關注

    關注

    13

    文章

    9693

    瀏覽量

    87292
  • 數據存儲
    +關注

    關注

    5

    文章

    997

    瀏覽量

    51615

原文標題:用Rust實現KV Server-3 命令行解析與內存存儲

文章出處:【微信號:Rust語言中文社區,微信公眾號:Rust語言中文社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    使用lwip socket udp功能,開發板為客戶端時不能夠接收服務器端發送過來數據

    請教下,使用 lwip socket udp 功能,開發板為客戶端時不能夠接收服務器端發送過來數據 ? 1,如果開發板為 服務器端,收發
    發表于 04-16 06:01

    用隊列實現的1對N的TCP服務器端,自動回復信息總發錯客戶端

    本帖最后由 kaneiqi1210 于 2014-7-17 12:43 編輯 如題,我仿照教材用隊列做的TCP一對多的服務器端1對1時,沒問題,而在1對多時,就出現,自動回復信息至不正確的客戶端(即非
    發表于 07-17 09:31

    labview TCP客戶端

    最近在做一個labview 客戶端測試小程序,服務器采用MFC編寫,客戶端采用TCP偵聽函數,通信可以連接,數據也正確,但是服務器端檢測
    發表于 06-30 23:15

    qt tcp程序服務器端發送數據之前能接收客戶端發送數據嗎?

    寫了一個tcp的客戶端服務器端,是服務器端客戶端發送文件,但是我想在服務器端
    發表于 04-22 20:06

    labview怎么實現服務器端一直等待客戶端發送數據

    我現在在做labview的服務器端,但是當客戶端發送數據結束后,我的服務器端會報錯。報錯的意思就是說客戶
    發表于 08-12 14:34

    labview和 讀碼的以太網通信 (沒有服務器端的程序)

    像電腦一樣能運行LABVIEW程序,兩臺讀碼掃描到的數據統一由主站通過以太網TCP直接發送過來的,現在不知道咋辦,網絡上關于這方面的資料太少了,都是有服務器端程序的,我摸索了好久仍然
    發表于 08-14 17:31

    LwIP調試問題,實現的是客戶端過來數據直接原樣返回

    最近在搞LwIP,裸跑,開發板做TCP服務器,電腦做客戶端,程序實現的是客戶端過來數據直接原樣返回。調試的時候遇到下面問題:在建立連接的
    發表于 10-03 09:25

    怎么用key0,key2控制服務器端客戶端知道有數據發送請求的?

    原子用key0,key2控制服務器端客戶端有請求數據發送,是如何知道有數據發送請求的,沒看明白
    發表于 07-29 04:17

    TCP:多個客戶端服務器發送數據

    本帖最后由 埥茬適里瀭叺妏牸 于 2019-8-23 10:27 編輯 就是當多個客戶端第一次連接上服務器發送數據沒問題,但是途中更改客戶
    發表于 08-22 15:05

    為什么LWIP的TCP客戶端服務器端斷開后繼續發送數據就無法檢測到連接狀態?

    發現LWIP的TCP客戶端有個BUG,當服務器端開之后,如果還繼續發送數據,那就不能檢測到連接狀態。求助求助
    發表于 10-29 20:26

    使用Arduino編程和esp32的開發板,多個客戶端連接服務器時怎么判斷是哪個客戶端發送過來數據

    我使用的是Arduino編程和esp32的開發板,當多個客戶端連接服務器的時候,服務器怎么判斷是哪個客戶端發送過來
    發表于 05-23 15:39

    如何使用esp8266服務器客戶端之間發送數據

    我是這個小組的新手,我剛剛寫信,如果有人能幫助我,我需要一個指南甚至一本書學習如何使用 esp8266 服務器客戶端之間發送
    發表于 04-27 07:05

    網絡調試和串口調試集合UDP TCP客戶端和TCP服務器端應用程序免費下載

    本文檔的主要內容詳細介紹的是網絡調試和串口調試集合UDP TCP客戶端和TCP服務器端應用程序免費下載。
    發表于 08-30 08:00 ?16次下載
    網絡調試和串口調試集合UDP TCP<b class='flag-5'>客戶端</b>和TCP<b class='flag-5'>服務器端</b>應用程序免費下載

    數據是怎么樣保證準確的從客戶端發送服務器端

    你有想過嗎,計算機網絡當中,數據是怎么樣保證準確的從客戶端發送服務器端的?中間涉及到了哪些理論?
    的頭像 發表于 07-01 10:09 ?2378次閱讀

    拒絕服務攻擊的基本概念

    服務器端收到客戶端發送過來的SYN請求包后,知道客戶端想要建立連接,于是向客戶端發送一個SYN請
    的頭像 發表于 10-08 11:07 ?3874次閱讀
    主站蜘蛛池模板: 黄黄的网站在线观看 | 天天干视频在线 | 色多多www视频在线观看免费 | 欧美性free | 亚洲欧美人成网站综合在线 | 国产在线欧美精品卡通动漫 | 免费看一级视频 | 奇米影视一区二区三区 | 亚州1区2区3区4区产品乱码2021 | 夜夜爱视频 | 天天干天天射天天插 | 国产黄色大全 | 欧美一区二区三区成人看不卡 | 日本加勒比在线视频 | 免费三级毛片 | 性欧美xxxxhd | 4438x色| 久久综合香蕉久久久久久久 | 国产美女流出白浆在线观看 | 4338×亚洲全国最大色成网站 | 黄色的视频网站在线观看 | 成人免费aaaaa毛片 | 欧美一级鲁丝片 | 九月婷婷亚洲综合在线 | 天天干天天操天天干 | 久久精品国产精品亚洲婷婷 | 亚洲欧美日韩综合一区 | 四虎国产永久在线精品免费观看 | 日韩在线视频www色 日韩在线视频免费观看 | 亚洲高清一区二区三区四区 | 亚洲地址一地址二地址三 | 国内自拍网红在综合图区 | 3344成年在线视频免费播放男男 | 男女爱爱免费高清 | 国产三级网 | 欧美日韩在线成人看片a | 日本三级欧美三级香港黄 | 久久国产精品免费 | 欧美福利在线播放 | 午夜视频在线观看一区二区 | 性欧美大战久久久久久久 |