在线观看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" }




審核編輯:劉清

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

    關注

    12

    文章

    9330

    瀏覽量

    86131
  • 數據存儲
    +關注

    關注

    5

    文章

    986

    瀏覽量

    51106

原文標題:用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 ?2162次閱讀

    拒絕服務攻擊的基本概念

    服務器端收到客戶端發送過來的SYN請求包后,知道客戶端想要建立連接,于是向客戶端發送一個SYN請
    的頭像 發表于 10-08 11:07 ?3611次閱讀
    主站蜘蛛池模板: 天天做天天爱夜夜想毛片 | 亚洲第一色在线 | 在线观看一级片 | 性xxxx欧美 | 18毛片| 午夜精品久久久 | 青草悠悠视频在线观看 | 日本免费一区二区三区视频 | 在线观看一区二区三区视频 | 性做久久久久久网站 | 亚洲精品456| 亚洲第八页 | 丁香六月色婷婷综合网 | 亚洲伊人99综合网 | 久久看片网 | 国模欢欢炮交啪啪150 | 五月激情综合丁香色婷婷 | 亚洲免费色视频 | 狠狠干干干| 国产美女视频黄a视频全免费网站 | 色综合欧美综合天天综合 | 婷婷色在线观看 | 国内久久精品 | 国产成年女一区二区三区 | 色丁香在线| 日本黄色片免费看 | 毛片午夜| 国产骚b| 激情五月在线 | 99自拍视频 | 岛国大片在线播放 | 欧美性野久久久久久久久 | 欧美一级乱理片免费观看 | 欧美日韩国产一区二区 | 国产精品免费观看网站 | 国产精品1区2区3区在线播放 | 84pao强力永久免费高清 | 特级一级毛片 | 四虎影酷 | 在线亚洲综合 | 夜夜夜夜夜夜夜猛噜噜噜噜噜噜 |