【Mio】TCP 服务器(八)
2023-09-27 14:23:46 时间
环境
- Time 2022-01-08
- Rust 1.57.0
- mio 0.8
概念
参考:https://github.com/tokio-rs/mio/blob/master/examples/tcp_server.rs
实现小写转大写的应答消息。
示例
应答消息
fn handle_client(event: &Event, client: &mut TcpStream) -> io::Result<()> {
if event.is_readable() {
let mut buffer = vec![0; 4096];
let mut bytes_read = 0;
loop {
match client.read(&mut buffer) {
Ok(n) => bytes_read = n,
Err(e) if e.kind() == WouldBlock => break,
Err(err) => return Err(err),
}
}
if bytes_read != 0 {
let received = &buffer[..bytes_read];
let str = from_utf8(received).unwrap();
client.write_all(str.to_ascii_uppercase().as_bytes())?;
}
};
Ok(())
}
总结
读取客户端消息,将小写转为大写并写回客户端。
附录
完整代码
use mio::{
event::Event,
net::{TcpListener, TcpStream},
Events, Interest, Poll, Token,
};
use std::{
collections::HashMap,
io::{self, ErrorKind::WouldBlock, Read, Write},
str::from_utf8,
};
const SERVER: Token = Token(0);
fn main() -> io::Result<()> {
let addr = "127.0.0.1:4444".parse().unwrap();
let mut server = TcpListener::bind(addr)?;
let mut poll = Poll::new()?;
let mut events = Events::with_capacity(128);
poll.registry()
.register(&mut server, SERVER, Interest::READABLE)?;
let mut clients = HashMap::new();
let mut unique_token = SERVER;
loop {
poll.poll(&mut events, None)?;
for event in events.iter() {
match event.token() {
SERVER => {
while let Some((token, client)) = accept(&server, &mut unique_token, &poll)? {
clients.insert(token, client);
}
}
token => {
if let Some(client) = clients.get_mut(&token) {
handle_client(event, client)?;
}
}
}
}
}
}
fn accept(
server: &TcpListener,
unique_token: &mut Token,
poll: &Poll,
) -> io::Result<Option<(Token, TcpStream)>> {
let (mut client, address) = match server.accept() {
Ok((client, address)) => (client, address),
Err(e) if e.kind() == WouldBlock => return Ok(None),
Err(e) => return Err(e),
};
unique_token.0 += 1;
let token = *unique_token;
poll.registry().register(
&mut client,
token,
Interest::READABLE.add(Interest::WRITABLE),
)?;
println!("客户端: {}", address);
Ok(Some((token, client)))
}
fn handle_client(event: &Event, client: &mut TcpStream) -> io::Result<()> {
if event.is_readable() {
let mut buffer = vec![0; 4096];
let mut bytes_read = 0;
loop {
match client.read(&mut buffer) {
Ok(n) => bytes_read = n,
Err(e) if e.kind() == WouldBlock => break,
Err(err) => return Err(err),
}
}
if bytes_read != 0 {
let received = &buffer[..bytes_read];
let str = from_utf8(received).unwrap();
client.write_all(str.to_ascii_uppercase().as_bytes())?;
}
};
Ok(())
}
相关文章
- 无法自动调试 未能调试远程过程。这通常说明未在服务器上启用调试 WCF 托管在IIS上
- 手把手教你在netty中使用TCP协议请求DNS服务器
- linux下安装EJBCA 搭建私有CA服务器
- 152 python网络编程 - TCP服务器
- 用iLO在惠普服务器安装exsi6.5
- 如何用Nagios远程执行插件(NRPE)来检测服务器内存使用率
- 《通信技术导论(原书第5版)》——1.10 单个服务器通过虚拟化技术执行多个服务器功能
- shell脚本自动输入用户名和密码更新服务器上的git项目
- ELK菜鸟手记 (四) - 利用filebeat和不同端口把不同服务器上的log4j日志传输到同一台ELK服务器
- 《高性能Linux服务器构建实战:系统安全、故障排查、自动化运维与集群架构》——2.4 网络探测和安全审核工具nmap
- 企业上云该如何选购适合自己的阿里云虚拟主机和云服务器产品?
- 详解Linux服务器最大tcp连接数
- 2015年Q4全球服务器市场增长5.2%,中国市场贡献巨大
- TCP ------ TCP创建服务器中出现的套接字
- socket编程 ------ 建立 TCP 服务器和客户端流程(阻塞方式)
- Gson本地和服务器环境不同遇到的Date转换问题 Failed to parse date []: Invalid time zone indicator
- 【ESP8266之AT开发】二、ESP8266的三种工作模式认识,AP模式下ESP8266建立TCP服务器,建立TCP客户端(解决防火墙)
- 【正点原子FPGA连载】 第三十二章基于lwip的TCP服务器性能测试实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南
- resin 服务器学习 配置 单点和 集群
- Linux——编写一个简单的服务器、客户端(使用TCP)——服务器一直监听本机的xxxx号端口,如果收到连接请求,将接收请求并接收客户端发来的消息;客户端与服务器端建立连接并发送一条消息。
- 通过 portal admin 来查看和删除已注册的 联合服务器
- 双线服务器托管的三大优势
- C#项目类型分三种,Dos(控制台),c/s(客户端与服务器),b/s(浏览器/服务器)