首页 > 其他分享 >20、Web服务示例

20、Web服务示例

时间:2023-05-24 18:11:51浏览次数:41  
标签:std Web use 20 thread 示例 workers unwrap let

如下是main.rs文件内容:

// src\main.rs
use hello::ThreadPool;
use std::thread;
use std::time::Duration;
use std::fs;
use std::io::prelude::*;
use std::net::TcpStream;
use std::net::TcpListener;

fn main() {
    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
    let pool = ThreadPool::new(4);

    for stream in listener.incoming().take(2) {
        let stream = stream.unwrap();

        pool.execute(|| {
            handle_connection(stream);
       });
    }

    println!("Shutting down")
}

fn handle_connection(mut stream: TcpStream) {
    let mut buffer = [0; 512];

    stream.read(&mut buffer).unwrap();

    let get = b"GET / HTTP/1.1\r\n";
    let sleep = b"GET /sleep HTTP/1.1\r\n";

    let (status_line, filename) = if buffer.starts_with(get) {
        ("HTTP/1.1 200 OK\r\n\r\n", "../hello.html")
    } else if buffer.starts_with(sleep) {
        thread::sleep(Duration::from_secs(5));
        ("HTTP/1.1 200 OK\r\n\r\n", "../hello.html")
    } else {
        ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "../404.html")
    };

    let contents = fs::read_to_string(filename).unwrap();
    
    let response = format!("{}{}", status_line, contents);

    stream.write(response.as_bytes()).unwrap();
    stream.flush().unwrap();
}

如下是lib.rs内容:

//src/lib.rs
use std::sync::Arc;
use std::sync::Mutex;
use std::sync::mpsc;
use std::thread;


enum Message {
    NewJob(Job),
    Terminate,
}

pub struct ThreadPool {
    workers: Vec<Worker>,
    sender: mpsc::Sender<Message>,
}

type Job = Box<dyn FnOnce() + Send + 'static>;

impl ThreadPool {
    pub fn new(size: usize) -> ThreadPool {
        assert!(size > 0);
        
        let (sender, receiver) = mpsc::channel();

        let receiver = Arc::new(Mutex::new(receiver));

        let mut workers = Vec::with_capacity(size);

        for id in 0..size {
            workers.push(Worker::new(id, Arc::clone(&receiver)));
        }

        ThreadPool {
            workers,
            sender,
        }
    }

    pub fn execute<F>(&self, f: F)
        where
            F: FnOnce() + Send + 'static
                {
                    let job = Box::new(f);
                    self.sender.send(Message::NewJob(job)).unwrap();
                }
}


struct Worker {
    id: usize,
    thread: Option<thread::JoinHandle<()>>,
}

impl Worker {
    fn new(id: usize, receiver: Arc<Mutex<mpsc::Receiver<Message>>>) -> Worker {
        let thread = thread::spawn(move || {
           loop {
            let message = receiver.lock().unwrap().recv().unwrap();
            
            match message {
                Message::NewJob(job) => {
                    println!("Worker {} got a job; execting.", id);
                    job();
                },
                Message::Terminate => {
                    println!("Worker {} was told to terminate.", id);
                    break;
                },
            }
            }
        });

        Worker {
            id,
            thread: Some(thread),
        }
    }
}

impl Drop for ThreadPool {
    fn drop(&mut self) {
        println!("Sending terminate message to all workers.");

        for _ in &mut self.workers {
            self.sender.send(Message::Terminate).unwrap();
        }

        println!("Shutting down all workers.");

        for worker in &mut self.workers {
            println!("Shutting down worker {}", worker.id);
            
            if let Some(thread) = worker.thread.take() {
                thread.join().unwrap();
            }
        }
    }
}

如下是Cargo.toml内容:

//Cargo.toml
[package]
name = "l2015"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]

[lib]
name = "l2025"

标签:std,Web,use,20,thread,示例,workers,unwrap,let
From: https://www.cnblogs.com/ColoFly/p/17429146.html

相关文章

  • 2021四川省赛
    The2021SichuanProvincialCollegiateProgrammingContestA-Chuanpai#include<bits/stdc++.h>usingnamespacestd;voidsolve(){ intk; cin>>k; intans=0; for(inti=1;i<=6;i++) for(intj=i;j<=6;j++) if(i+j==k) ans++; co......
  • 1688阿里巴巴中国站按关键字搜索抓取新品数据API接口展示示例(封装可高并发)(Java系列)
    ​一、电商平台上新的重要性 电商平台上新非常重要。 首先,持续的新品上线可以吸引更多的用户访问平台和留存用户的兴趣。新品可以激发用户想要知道更多、购买更多的欲望,从而提高用户的使用频率和转化率。此外,新品上线也可以使电商平台更具竞争力,吸引更多的品牌入驻并增强......
  • Exp8 Web安全
    Exp8Web安全目录Exp8Web安全1.基础问题回答2.实践过程记录2.1Web前端HTML能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML。2.2Web前端javascipt理解JavaScript的基本功能,理解DOM。在(1)的基础上,编写JavaScript验证用户名、密码的规则。在用......
  • Exp8 Web安全 20202211 王宏韬
    目录一、实践内容二、基础问题(1)什么是表单(2)浏览器可以解析运行什么语言(3)WebServer支持哪些动态语言(4)防范注入攻击的方法有哪些三、总结体会四、实验过程(1)WEBHTML(2)WEBJAVASCRIPT(3)WEB后端MYSQL(4)WEB后端PHP(5)SQL注入(6)XSS(7)WEBGOATSQL注入......
  • 2022年第十四届四川省大学生程序设计大赛 A
    AAdjacentSwapping题意:给定一个字符串,每次可以移动相邻字符,求最小移动次数可以把它变成s+s这样左右两边相同的字符串。思路:1:我们知道他一定是偶数长度,所以我们把字符串分成两部分s1和s22:贪心的扫描一遍这个字符串,s1就是前一半,然后计算在满足这一般的时候他要移动多少次,即直......
  • SQL_lab总结11-20关
    第十一关现在为post类型抓包后发到repeater模块抓包后找注入点和闭合方式单引号闭合uname接下来开始尝试测试列数目由此可见有字段数只有2然后进行联合注入当然报错注入也可第十二十三十四关和第十一关操作相同,但第十二关闭合为")十三关为')十四关为"十五关布尔......
  • 20230524_配置环境
    debhttp://mirrors.aliyun.com/ubuntu/bionicmainrestricteduniversemultiversedeb-srchttp://mirrors.aliyun.com/ubuntu/bionicmainrestricteduniversemultiversedebhttp://mirrors.aliyun.com/ubuntu/bionic-securitymainrestricteduniversemultivers......
  • 2023江西省省赛
    A.DrillWoodtoMakeFire问题的题意是:给定木材着火的临界值N,燧人氏的强度S和速度V,你能确定燧人氏是否能钻木取火?即满足条件为:s*v>=n。满足输出1,否则输出0.#include<bits/stdc++.h>usingnamespacestd;intmain(){intt,n,s,v;cin>>t;while(t--){......
  • python嵌入HTTP代理代码示例
    以下是使用Python嵌入HTTP代理的示例代码:```pythonimporturllib.request#设置代理服务器地址和端口号proxy_handler=urllib.request.ProxyHandler({'http':'http://proxy.example.com:8080'})#创建opener对象opener=urllib.request.build_opener(proxy_handler)#使用opene......
  • 【JavaWeb-02】Web服务器
    文章目录2.web服务器2.1技术讲解2.2web服务器2.web服务器2.1技术讲解JSP/Servlet:B/S:浏览和服务器C/S:客户端和服务端sun公司主推的B/S架构基于Java语言的(所有的大公司,或者一些开源的组件,都是用Java写的)可以承载三高问题带来的影响2.2web服务器IIS:微软的Tmocat:Java初学人员......