1. 服务器

1.1 监听未使用的 TCP/IP 端口

  实例中,程序将监听显示在控制台上的端口,直到一个请求被发出。当将端口设置为 0 时,SocketAddrV4 会分配一个随机端口。

use std::io::{Error, Read};
use std::net::{Ipv4Addr, SocketAddrV4, TcpListener};

fn main() -> Result<(), Error> {
let loopback = Ipv4Addr::new(127, 0, 0, 1);
let socket = SocketAddrV4::new(loopback, 0);
let listener = TcpListener::bind(socket)?;
let port = listener.local_addr()?;
println!("在{}上监听,访问这个端口结束程序", port);
let (mut tcp_stream, addr) = listener.accept()?; // 阻塞,直到被请求
println!("收到连接! {:?} 正在发送数据。", addr);
let mut input = String::new();
let _ = tcp_stream.read_to_string(&mut input)?;
println!("{:?} 说 {}", addr, input);
Ok(())
}

  交互步骤如下:

    1. 运行cargo run输出(设命令终端为A)
在127.0.0.1:35963上监听,访问这个端口结束程序
    1. 新启命令终端,运行telnet 127.0.0.1 35963(设命令终端为B),输出
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
    1. 此时服务端收到请求,终端A输出如下:
在127.0.0.1:35963上监听,访问这个端口结束程序
收到连接! 127.0.0.1:56962 正在发送数据。
    1. 在客户端(即终端B)上输入信息“你好”后,按Ctrl+]键进入 telnet 的命令模式,然后输入 quit 关闭连接。这样,telnet 客户端会发送一个正常的关闭连接请求,服务器就能收到数据并打印出来了:
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
你好
^]
telnet> quit
Connection closed.
    1. 此时服务端的输入如下:
在127.0.0.1:35963上监听,访问这个端口结束程序
收到连接! 127.0.0.1:56962 正在发送数据。
127.0.0.1:56962 说 你好