如何连接到通过 Rust 托管的 Web 套接字服务器?
How to connect to a Web Socket Server hosted via Rust?
我有一个使用 native_tls
用 Rust 编写的 Web Socket 服务器,因为我需要最终让它能够远程接收连接
use {
native_tls::{Error as TlsError, HandshakeError, Identity, TlsAcceptor},
std::{
fs::File,
io::{Error as IoError, Read},
net::{TcpListener, TcpStream},
sync::Arc,
thread::spawn,
},
};
#[derive(Debug)]
enum Error {
IoError(IoError),
TlsError(TlsError),
HandshakeError(HandshakeError<TcpStream>),
}
impl From<IoError> for Error {
fn from(error: IoError) -> Self {
Self::IoError(error)
}
}
impl From<TlsError> for Error {
fn from(error: TlsError) -> Self {
Self::TlsError(error)
}
}
impl From<HandshakeError<TcpStream>> for Error {
fn from(error: HandshakeError<TcpStream>) -> Self {
Self::HandshakeError(error)
}
}
fn main() -> Result<(), Error> {
let identity = Identity::from_pkcs12(
&{
let mut identity = vec![];
File::open("cert.p12")?.read_to_end(&mut identity)?;
identity
},
"asdf",
)?;
let acceptor = Arc::new(TlsAcceptor::new(identity)?);
for stream in TcpListener::bind("127.0.0.1:80")?.incoming() {
let acceptor = acceptor.clone();
spawn(move || -> Result<(), Error> {
let client = acceptor.accept(stream?)?;
println!("{:?}", client);
Ok(())
});
}
Ok(())
}
我在尝试连接时使用的javascript:
let socket = new WebSocket(`wss://127.0.0.1:80`);
一切正常,但当我通过 Javascript 连接到它时,主机接收并接受连接,但它立即断开:
Firefox can’t establish a connection to the server at wss://127.0.0.1:80/.
我仍然不熟悉 Javascript 和 cert.p12
文件的证书处理。为了获取此文件,我遵循了 here 中的基本教程,但我不确定这样做是否正确。
我遇到的问题是 native_tls
本身无法作为 websocket 工作。它需要一些其他的 websocket 实现才能使用,例如 tungstenite。当使用 tungstenite
时,为了让 native_tls
和它自己一起工作,我会托管一个普通的 Tcp 服务器,而不是通过 tungstenite
接受它,我会用来自 native_tls
然后通过 tungstenite
接受连接,这将允许 tls
连接访问 tungstenite
的框架。
我有一个使用 native_tls
用 Rust 编写的 Web Socket 服务器,因为我需要最终让它能够远程接收连接
use {
native_tls::{Error as TlsError, HandshakeError, Identity, TlsAcceptor},
std::{
fs::File,
io::{Error as IoError, Read},
net::{TcpListener, TcpStream},
sync::Arc,
thread::spawn,
},
};
#[derive(Debug)]
enum Error {
IoError(IoError),
TlsError(TlsError),
HandshakeError(HandshakeError<TcpStream>),
}
impl From<IoError> for Error {
fn from(error: IoError) -> Self {
Self::IoError(error)
}
}
impl From<TlsError> for Error {
fn from(error: TlsError) -> Self {
Self::TlsError(error)
}
}
impl From<HandshakeError<TcpStream>> for Error {
fn from(error: HandshakeError<TcpStream>) -> Self {
Self::HandshakeError(error)
}
}
fn main() -> Result<(), Error> {
let identity = Identity::from_pkcs12(
&{
let mut identity = vec![];
File::open("cert.p12")?.read_to_end(&mut identity)?;
identity
},
"asdf",
)?;
let acceptor = Arc::new(TlsAcceptor::new(identity)?);
for stream in TcpListener::bind("127.0.0.1:80")?.incoming() {
let acceptor = acceptor.clone();
spawn(move || -> Result<(), Error> {
let client = acceptor.accept(stream?)?;
println!("{:?}", client);
Ok(())
});
}
Ok(())
}
我在尝试连接时使用的javascript:
let socket = new WebSocket(`wss://127.0.0.1:80`);
一切正常,但当我通过 Javascript 连接到它时,主机接收并接受连接,但它立即断开:
Firefox can’t establish a connection to the server at wss://127.0.0.1:80/.
我仍然不熟悉 Javascript 和 cert.p12
文件的证书处理。为了获取此文件,我遵循了 here 中的基本教程,但我不确定这样做是否正确。
我遇到的问题是 native_tls
本身无法作为 websocket 工作。它需要一些其他的 websocket 实现才能使用,例如 tungstenite。当使用 tungstenite
时,为了让 native_tls
和它自己一起工作,我会托管一个普通的 Tcp 服务器,而不是通过 tungstenite
接受它,我会用来自 native_tls
然后通过 tungstenite
接受连接,这将允许 tls
连接访问 tungstenite
的框架。