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监听8081
- telnet 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
