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在新窗口打开

上次更新:
贡献者: tickbh