use futures_util::sink::SinkExt;
use futures_util::stream::{Stream, StreamExt};
use rustls::ServerConfig;
use std::fs::File;
use std::io::BufReader;
use std::sync::Arc;
use tokio::net::{TcpListener, TcpStream};
use tokio_rustls::TlsAcceptor;
use tokio_tungstenite::accept_async;
use tokio_tungstenite::tungstenite::protocol::Message;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 加载SSL keys
let certs = rustls::internal::pemfile::certs(&mut BufReader::new(File::open(
"d:\\User\\Desktop\\wss\\openssl\\server.crt",
)?))
.unwrap();
let key = rustls::internal::pemfile::pkcs8_private_keys(&mut BufReader::new(File::open(
"d:\\User\\Desktop\\wss\\openssl\\server.key",
)?))
.unwrap()[0]
.clone();
let tls_cfg = {
let mut cfg = ServerConfig::new(rustls::NoClientAuth::new());
cfg.set_single_cert(certs, key).expect("error setting cert");
Arc::new(cfg)
};
let tls_acceptor = TlsAcceptor::from(tls_cfg);
// 设置TCP监听器
let addr = "127.0.0.1:10096";
let listener = TcpListener::bind(&addr).await?;
println!("Listening on: {}", addr);
while let Ok((stream, _)) = listener.accept().await {
let acceptor = tls_acceptor.clone();
tokio::spawn(async move {
if let Ok(tls_stream) = acceptor.accept(stream).await {
let websocket_result = accept_async(tls_stream).await;
match websocket_result {
Ok(mut ws_stream) => {
println!("WebSocket connection established");
while let Some(message_result) = ws_stream.next().await {
match message_result {
Ok(message) => {
if message.is_text() || message.is_binary() {
// 对接收到的消息进行处理
println!("接收到消息: {}", message);
// 回传消息
println!("回传消息: {}", message);
if let Err(_) = ws_stream.send(message).await {
// 处理错误
break;
}
}
}
Err(e) => {
// 处理错误
println!("Error: {}", e);
break;
}
}
}
}
Err(e) => {
println!("Error during the websocket handshake occurred: {}", e);
}
}
}
});
}
Ok(())
}