websocket转换
注意
wmproxy 目前仍处于 RC (Release Candidate) 阶段。您可以尝试用它来实现您的需求,但是现在目前来说不是非常的稳定,并未进行过超级充分的测试,暂时尽量不要用于生产环境。
设计目标
通过简单配置方便用户快速使用tcp转websocket及websocket转tcp,也可支持http升级到websocket协议。
wmproxy ws-proxy
启动websocket协议转发服务 通过命令wmproxy ws-proxy --help
可以得到
Usage: wmproxy.exe ws-proxy [-f=ARG] -t=ARG [--access-log=ARG] --mode=<ws2tcp,tcp2ws,tcp2wss> [--ws]
[--control=ARG] [--disable-stdout] [--disable-control] [-v] [--default-level=ARG]
Available options:
-f, --from=ARG 负载均衡来源地址
[default: 127.0.0.1:80]
-t, --to=ARG 负载均衡映射地址
--access-log=ARG 访问日志放的位置如"logs/access.log trace"
--mode=<ws2tcp,tcp2ws,tcp2wss> 当前代理的模式
--domain=ARG 当前域名
--ws 是否支持websocket
--control=ARG 输入控制台的监听地址
[default: 127.0.0.1:8837]
模式中
- ws2tcp 指websocket的流量转成tcp
- tcp2ws 指tcp的流量转成websocket
- tcp2wss 指tcp的流量转成websocket tls流量
# 将流量通过ws转成tcp
wmproxy ws-proxy -t :8082 --mode ws2tcp
或者
# 将流量通过tcp转成ws
wmproxy ws-proxy -t :8099 --mode tcp2ws
即可启动websocket的流量。来源为80端口。
测试tcp2ws
websocat是一个用Rust实现的常用的websocket的实现工具,这里我们将拿他来做实验。 我们程序监听8082的tcp流量并转发到8081的websocket流量
wmproxy ws-proxy -f :8082 -t :8081 --mode tcp2ws
websocat -s 8081
监听8081telnet 127.0.0.1 8082
手动建立8082的端口
通过telnet发送的信息,在websocat服务端能正确的输出,并且websocat的发送能正常的显示到telnet中。
测试ws2tcp
我们程序监听8081的websocket流量并转发到8082的tcp流量。我们这里自己编写了一个tcp服务端,原样转发客户端的数据: 源码tcp.rs
use tokio::{net::TcpListener, io::{AsyncReadExt, AsyncWriteExt}};
#[tokio::main]
async fn main() -> std::io::Result<()> {
let tcp_listener = TcpListener::bind(format!("127.0.0.1:{}", 8082)).await?;
loop {
let mut stream = tcp_listener.accept().await?;
tokio::spawn(async move {
let mut buf = vec![0;20480];
loop {
if let Ok(size) = stream.0.read(&mut buf).await {
println!("receiver = {:?} size = {:?}", &buf[..size], size);
let _ = stream.0.write_all(b"from tcp:").await;
let _ = stream.0.write_all(&buf[..size]).await;
} else {
break;
}
}
});
}
}
cargo run --example tcp
监听8082的tcp端口wmproxy ws-proxy -f :8081 -t :8082 --mode ws2tcp
websocat ws://127.0.0.1:8081
主动连接8081的websocket服务
通过websocat发送给服务端的同时能正确的收到来自服务端的原样消息。
支持作者
如果该项目对您有用,请帮忙加个Star,Github