数据同步
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

59 rindas
1.9KB

  1. use tokio::net::TcpListener;
  2. use tokio::io::{AsyncReadExt, AsyncWriteExt};
  3. use config::Config;
  4. fn check_ok_message(message: &[u8]) -> u8 {
  5. let message_str = String::from_utf8_lossy(message);
  6. if message_str.contains("OK") {
  7. 0xFF
  8. } else {
  9. 0x00
  10. }
  11. }
  12. #[tokio::main]
  13. async fn main() -> Result<(), Box<dyn std::error::Error>> {
  14. // 读取配置文件
  15. let settings = Config::builder()
  16. .add_source(config::File::with_name("config"))
  17. .build()?;
  18. let address = settings.get_string("server.address")?;
  19. let port = settings.get_int("server.port")? as u16;
  20. let bind_address = format!("{}:{}", address, port);
  21. let listener = TcpListener::bind(&bind_address).await?;
  22. println!("Server listening on {}", bind_address);
  23. loop {
  24. let (mut socket, addr) = listener.accept().await?;
  25. println!("New client connected: {}", addr);
  26. tokio::spawn(async move {
  27. let mut buf = [0; 1024];
  28. loop {
  29. match socket.read(&mut buf).await {
  30. Ok(0) => {
  31. println!("Client disconnected: {}", addr);
  32. return;
  33. }
  34. Ok(n) => {
  35. // Check message and send single bit response
  36. let response = check_ok_message(&buf[..n]);
  37. println!("接收到消息: {},响应: {}", String::from_utf8_lossy(&buf[..n]), response);
  38. if let Err(e) = socket.write_all(&[response]).await {
  39. println!("Failed to write to socket: {}", e);
  40. return;
  41. }
  42. }
  43. Err(e) => {
  44. println!("Failed to read from socket: {}", e);
  45. return;
  46. }
  47. }
  48. }
  49. });
  50. }
  51. }