[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-5534":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":25,"hasPages":23,"topics":26,"createdAt":10,"pushedAt":10,"updatedAt":38,"readmeContent":39,"aiSummary":40,"trendingCount":16,"starSnapshotCount":16,"syncStatus":41,"lastSyncTime":42,"discoverSource":43},5534,"websocat","vi\u002Fwebsocat","vi","Command-line client for WebSockets, like netcat (or curl) for ws:\u002F\u002F with advanced socat-like functions","",null,"Rust",8546,328,64,150,0,1,17,50,8,38.55,"MIT License",false,"master",true,[27,28,29,30,31,32,33,34,35,36,37],"cli","command-line","command-line-tool","curl","netcat","proxy","rfc-6455","socat","websocket-client","websocket-server","websockets","2026-06-12 02:01:11","# websocat\nNetcat, curl and socat for [WebSockets](https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWebSocket).\n\n[![Gitter](https:\u002F\u002Fbadges.gitter.im\u002Fwebsocat.svg)](https:\u002F\u002Fgitter.im\u002Fwebsocat\u002FLobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=body_badge)\n[![image-build](https:\u002F\u002Fgithub.com\u002Fvi\u002Fwebsocat\u002Factions\u002Fworkflows\u002Fcontainer-image-buildah.yml\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002Fvi\u002Fwebsocat\u002Fpkgs\u002Fcontainer\u002Fwebsocat)\n\n## Examples\n\n### Connect to public echo server (Ctrl+d to quit)\n\n```\n$ websocat ws:\u002F\u002Fws.vi-server.org\u002Fmirror\n123\n123\nABC\nABC\n\n$ docker run --rm -ti ghcr.io\u002Fvi\u002Fwebsocat:nightly wss:\u002F\u002Fws.vi-server.org\u002Fmirror\n123\n123\nABC\nABC\n```\n\n### Serve and connect\n\n```\nA$ websocat -s 1234\nListening on ws:\u002F\u002F127.0.0.1:1234\u002F\nABC\n123\n\nB$ websocat ws:\u002F\u002F127.0.0.1:1234\u002F\nABC\n123\n```\n\n### Open a tab in Chromium using remote debugging.\n\n```\n$ chromium --remote-debugging-port=9222&\n$ curl -sg http:\u002F\u002F127.0.0.1:9222\u002Fjson\u002Fnew | grep webSocketDebuggerUrl | cut -d'\"' -f4 | head -1\nws:\u002F\u002F127.0.0.1:9222\u002Fdevtools\u002Fpage\u002FA331E56CCB8615EB4FCB720425A82259\n$ echo 'Page.navigate {\"url\":\"https:\u002F\u002Fexample.com\"}' | websocat -n1 --jsonrpc --jsonrpc-omit-jsonrpc ws:\u002F\u002F127.0.0.1:9222\u002Fdevtools\u002Fpage\u002FA331E56CCB8615EB4FCB720425A82259\n{\"id\":2,\"result\":{\"frameId\":\"A331E56CCB8615EB4FCB720425A82259\",\"loaderId\":\"EF5AAD19F2F8BB27FAF55F94FFB27DF9\"}}\n```\n\n\n### Proxy TCP connections to WebSocket connections and back.\n\n```\n$ websocat --oneshot -b ws-l:127.0.0.1:1234 tcp:127.0.0.1:22&\n$ websocat --oneshot -b tcp-l:127.0.0.1:1236 ws:\u002F\u002F127.0.0.1:1234\u002F&\n$ nc 127.0.0.1 1236\nSSH-2.0-OpenSSH_7.4p1 Debian-10+deb9u3\nqwertyu\nProtocol mismatch.\n```\n\n\n### Broadcast all messages between connected WebSocket clients\n\n```\nA$ websocat -t ws-l:127.0.0.1:1234 broadcast:mirror:\nB$ websocat ws:\u002F\u002F127.0.0.1:1234\nC$ websocat ws:\u002F\u002F127.0.0.1:1234\n```\n\n(if you like this one, you may actually want https:\u002F\u002Fgithub.com\u002Fvi\u002Fwsbroad\u002F instead)\n\nSee [moreexamples.md](.\u002Fmoreexamples.md) for further examples.\n\n## Features\n\n* Connecting to and serving WebSockets from command line.\n* Executing external program and making it communicate to WebSocket using stdin\u002Fstdout.\n* Text and binary modes, converting between lines (or null-terminated records) and messages.\n* Inetd mode, UNIX sockets (including abstract namespaced on Linux).\n* Integration with Nginx using TCP or UNIX sockets.\n* Directly using unauthenticated SOCKS5 servers for connecting to WebSockets and listening WebSocket connection.\n* Auto-reconnect and connection-reuse modes.\n* Linux, Windows and Mac support, with [pre-built executables][releases].\n* Low-level WebSocket clients and servers with overridable underlying transport connection, e.g. calling external program to serve as a transport for websocat (for SSL, proxying, etc.).\n\n[releases]:https:\u002F\u002Fgithub.com\u002Fvi\u002Fwebsocat\u002Freleases\n\n# Installation\n\nThere are multiple options for installing WebSocat. From easy to hard:\n\n## FreeBSD\n\n`pkg install websocat`\n\n## Debian \u002F Ubuntu\n* Download a pre-build executable from [GitHub releases][releases].\n* Websocat is not yet officially packaged for Debian. Some older versions of Websocat may also have Debian package files available on Github releases.\n\n## macOS\n\n[Homebrew](https:\u002F\u002Fbrew.sh): `brew install websocat`\n\n[MacPorts](https:\u002F\u002Fwww.macports.org): `sudo port install websocat`\n\n## From source\n* Install the [Rust toolchain](https:\u002F\u002Frustup.rs\u002F) and do `cargo install websocat`. If something fails with a `-sys` crate, try with `--no-default-features`;\n* Build Websocat from source code (see below), then move `target\u002Frelease\u002Fwebsocat` somewhere to the PATH.\n\n## Pre-built binaries\nPre-built binaries for Linux (usual and musl), Windows, OS X and Android are available on the [releases page](https:\u002F\u002Fgithub.com\u002Fvi\u002Fwebsocat\u002Freleases).\n\n\nBuilding from source code\n---\n\n1. Install the [Rust toolchain](https:\u002F\u002Frustup.rs\u002F). Note that Websocat v1 (i.e. the current stable version) may fail to support too new Rust due to its old dependencies which can be broken by e.g. [this](https:\u002F\u002Fgithub.com\u002Frust-lang\u002Frust\u002Fpull\u002F78802).\n2. `cargo build --release`.\n3. Find the executable somewhere under `target\u002F`, e.g. in `target\u002Frelease\u002Fwebsocat`.\n\n### Rust versions\n\n\n|Websocat versions|Minimal Rust version|Maximal Rust version|\n|----|----|----|\n| 4.0.0-alpha1 | 1.84 | ?   |\n| 1.12+     | ?    | ?          |\n| 1.9 - 1.11| 1.46 | maybe 1.63 |\n| 1.6 - 1.8 | 1.34 | maybe 1.63  |\n| 1.3 - 1.5 | 1.31 | 1.47? |\n| 1.2       | 1.28 | 1.47? |\n| 1.0-1.1   | 1.23 | 1.47? |\n| 1.2       | ?    | ?     |\n\nNote that building with legacy Rust version (e.g. 1.46) may require manually copying `Cargo.lock.legacy` to `Cargo.lock` prior to the building.\n\nEarly non-async versions of Websocat should be buildable by even older rustc.  \n\nNote that old versions of Websocat may misbehave if built by Rust 1.48 or later due to https:\u002F\u002Fgithub.com\u002Frust-lang\u002Frust\u002Fpull\u002F71274\u002F.\n\nIt may be not a good idea to build v1.x line of Websocat with Rust 1.64 due to [IP address representation refactor]. It may expose previously hidden undefined behaviour in legacy dependencies. (In practice, it seems to just work though - but a lot of time passed since I checked Websocat properly and in detail).\n\n[ipaddr]:https:\u002F\u002Fgithub.com\u002Frust-lang\u002Frust\u002Fpull\u002F78802\n\n\nSSL on Android\n---\n\nwebsocat's `wss:\u002F\u002F` may fail on Android. As a workaround, download certificate bundle, for example, from https:\u002F\u002Fcurl.haxx.se\u002Fca\u002Fcacert.pem and specify it explicitly:\n\n    SSL_CERT_FILE=cacert.pem \u002Fdata\u002Flocal\u002Ftmp\u002Fwebsocat wss:\u002F\u002Fecho.websocket.org\n\nOr just use `--insecure` option.\n\nDocumentation\n---\n\nBasic usage examples are provided at the top of this README and in `--help` message. More tricks are described in [moreexamples.md](.\u002Fmoreexamples.md).\n\nThere is a [list of all address types and overlays](doc.md).\n\n\u003Cdetails>\u003Csummary>`websocat --help=long` output\u003C\u002Fsummary>\n\n```\nwebsocat 1.13.0\nVitaly \"_Vi\" Shukela \u003Cvi0oss@gmail.com>\nCommand-line client for web sockets, like netcat\u002Fcurl\u002Fsocat for ws:\u002F\u002F.\n\nUSAGE:\n    websocat ws:\u002F\u002FURL | wss:\u002F\u002FURL               (simple client)\n    websocat -s port                            (simple server)\n    websocat [FLAGS] [OPTIONS] \u003Caddr1> \u003Caddr2>  (advanced mode)\n\nFLAGS:\n        --stdout-announce-listening-ports        [A] Print a line to stdout for each port being listened\n        --async-stdio\n            [A] On UNIX, set stdin and stdout to nonblocking mode instead of spawning a thread. This should improve\n            performance, but may break other programs running on the same console.\n        --compress-deflate\n            [A] Compress data coming to a WebSocket using deflate method. Affects only binary WebSocket messages.\n\n        --compress-gzip\n            [A] Compress data coming to a WebSocket using gzip method. Affects only binary WebSocket messages.\n\n        --compress-zlib\n            [A] Compress data coming to a WebSocket using zlib method. Affects only binary WebSocket messages.\n\n        --crypto-reverse\n            [A] Swap encryption and decryption operations in `crypto:` specifier - encrypt on read, decrypto on write.\n\n        --dump-spec                              [A] Instead of running, dump the specifiers representation to stdout\n    -e, --set-environment\n            Set WEBSOCAT_* environment variables when doing exec:\u002Fcmd:\u002Fsh-c:\n            Currently it's WEBSOCAT_URI and WEBSOCAT_CLIENT for\n            request URI and client address (if TCP)\n            Beware of ShellShock or similar security problems.\n    -E, --exit-on-eof                            Close a data transfer direction if the other one reached EOF\n        --foreachmsg-wait-read                   [A] Wait for reading to finish before closing foreachmsg:'s peer\n        --jsonrpc\n            Format messages you type as JSON RPC 2.0 method calls. First word becomes method name, the rest becomes\n            parameters, possibly automatically wrapped in [].\n        --jsonrpc-omit-jsonrpc                   [A] Omit `jsonrpc` field when using `--jsonrpc`, e.g. for Chromium\n        --just-generate-key                      [A] Just a Sec-WebSocket-Key value without running main Websocat\n        --lengthprefixed-little-endian\n            [A] Use little-endian framing headers instead of big-endian for `lengthprefixed:` overlay.\n\n        --lengthprefixed-skip-read-direction\n            [A] Only affect one direction of the `lengthprefixed:` overlay, bypass tranformation for the other one.\n\n        --lengthprefixed-skip-write-direction\n            [A] Only affect one direction of the `lengthprefixed:` overlay, bypass tranformation for the other one.\n\n        --linemode-strip-newlines\n            [A] Don't include trailing \\n or \\r\\n coming from streams in WebSocket messages\n\n    -0, --null-terminated                        Use \\0 instead of \\n for linemode\n        --no-line                                [A] Don't automatically insert line-to-message transformation\n        --no-exit-on-zeromsg\n            [A] Don't exit when encountered a zero message. Zero messages are used internally in Websocat, so it may\n            fail to close connection at all.\n        --no-fixups\n            [A] Don't perform automatic command-line fixups. May destabilize websocat operation. Use --dump-spec without\n            --no-fixups to discover what is being inserted automatically and read the full manual about Websocat\n            internal workings.\n        --no-async-stdio                         [A] Inhibit using stdin\u002Fstdout in a nonblocking way if it is not a tty\n    -1, --one-message                            Send and\u002For receive only one message. Use with --no-close and\u002For -u\u002F-U.\n        --oneshot                                Serve only once. Not to be confused with -1 (--one-message)\n        --print-ping-rtts\n            Print measured round-trip-time to stderr after each received WebSocket pong.\n\n        --exec-exit-on-disconnect\n            [A] Make exec: or sh-c: or cmd: immediately exit when connection is closed, don't wait for termination.\n\n        --exec-sighup-on-stdin-close\n            [A] Make exec: or sh-c: or cmd: send SIGHUP on UNIX when input is closed.\n\n        --exec-sighup-on-zero-msg\n            [A] Make exec: or sh-c: or cmd: send SIGHUP on UNIX when facing incoming zero-length message.\n\n    -q                                           Suppress all diagnostic messages, except of startup errors\n        --reuser-send-zero-msg-on-disconnect\n            [A] Make reuse-raw: send a zero-length message to the peer when some clients disconnects.\n\n    -s, --server-mode                            Simple server mode: specify TCP port or addr:port as single argument\n    -S, --strict\n            strict line\u002Fmessage mode: drop too long messages instead of splitting them, drop incomplete lines.\n\n        --timestamp-monotonic                    [A] Use monotonic clock for `timestamp:` overlay\n    -k, --insecure                               Accept invalid certificates and hostnames while connecting to TLS\n        --udp-broadcast                          [A] Set SO_BROADCAST\n        --udp-multicast-loop                     [A] Set IP[V6]_MULTICAST_LOOP\n        --udp-oneshot                            [A] udp-listen: replies only one packet per client\n        --udp-reuseaddr\n            [A] Set SO_REUSEADDR for UDP socket. Listening TCP sockets are always reuseaddr.\n\n        --uncompress-deflate\n            [A] Uncompress data coming from a WebSocket using deflate method. Affects only binary WebSocket messages.\n\n        --uncompress-gzip\n            [A] Uncompress data coming from a WebSocket using deflate method. Affects only binary WebSocket messages.\n\n        --uncompress-zlib\n            [A] Uncompress data coming from a WebSocket using deflate method. Affects only binary WebSocket messages.\n\n    -u, --unidirectional                         Inhibit copying data in one direction\n    -U, --unidirectional-reverse\n            Inhibit copying data in the other direction (or maybe in both directions if combined with -u)\n\n        --accept-from-fd\n            [A] Do not call `socket(2)` in UNIX socket listener peer, start with `accept(2)` using specified file\n            descriptor number as argument instead of filename\n        --unlink                                 [A] Unlink listening UNIX socket before binding to it\n    -V, --version                                Prints version information\n    -v                                           Increase verbosity level to info or further\n    -b, --binary                                 Send message to WebSockets as binary messages\n    -n, --no-close                               Don't send Close message to websocket on EOF\n        --websocket-ignore-zeromsg\n            [A] Silently drop incoming zero-length WebSocket messages. They may cause connection close due to usage of\n            zero-len message as EOF flag inside Websocat.\n    -t, --text                                   Send message to WebSockets as text messages\n        --base64\n            Encode incoming binary WebSocket messages in one-line Base64 If `--binary-prefix` (see `--help=full`) is\n            set, outgoing WebSocket messages that start with the prefix are decoded from base64 prior to sending.\n        --base64-text\n            [A] Encode incoming text WebSocket messages in one-line Base64. I don't know whether it can be ever useful,\n            but it's for symmetry with `--base64`.\n\nOPTIONS:\n        --socks5 \u003Cauto_socks5>\n            Use specified address:port as a SOCKS5 proxy. Note that proxy authentication is not supported yet. Example:\n            --socks5 127.0.0.1:9050\n        --autoreconnect-delay-millis \u003Cautoreconnect_delay_millis>\n            [A] Delay before reconnect attempt for `autoreconnect:` overlay. [default: 20]\n\n        --basic-auth \u003Cbasic_auth>\n            Add `Authorization: Basic` HTTP request header with this base64-encoded parameter\n\n        --queue-len \u003Cbroadcast_queue_len>\n            [A] Number of pending queued messages for broadcast reuser [default: 16]\n\n    -B, --buffer-size \u003Cbuffer_size>                                  Maximum message size, in bytes [default: 65536]\n        --byte-to-exit-on \u003Cbyte_to_exit_on>\n            [A] Override the byte which byte_to_exit_on: overlay looks for [default: 28]\n\n        --client-pkcs12-der \u003Cclient_pkcs12_der>                      [A] Client identity TLS certificate\n        --client-pkcs12-passwd \u003Cclient_pkcs12_passwd>\n            [A] Password for --client-pkcs12-der pkcs12 archive. Required on Mac.\n\n        --close-reason \u003Cclose_reason>\n            Close connection with a reason message. This option only takes effect if --close-status-code option is\n            provided as well.\n        --close-status-code \u003Cclose_status_code>                      Close connection with a status code.\n        --crypto-key \u003Ccrypto_key>\n            [A] Specify encryption\u002Fdecryption key for `crypto:` specifier. Requires `base64:`, `file:` or `pwd:` prefix.\n\n    -H, --header \u003Ccustom_headers>...\n            Add custom HTTP header to websocket client request. Separate header name and value with a colon and\n            optionally a single space. Can be used multiple times. Note that single -H may eat multiple further\n            arguments, leading to confusing errors. Specify headers at the end or with equal sign like -H='X: y'.\n        --server-header \u003Ccustom_reply_headers>...\n            Add custom HTTP header to websocket upgrade reply. Separate header name and value with a colon and\n            optionally a single space. Can be used multiple times. Note that single -H may eat multiple further\n            arguments, leading to confusing errors.\n        --exec-args \u003Cexec_args>...\n            [A] Arguments for the `exec:` specifier. Must be the last option, everything after it gets into the exec\n            args list.\n        --header-to-env \u003Cheaders_to_env>...\n            Forward specified incoming request header to H_* environment variable for `exec:`-like specifiers.\n\n    -h, --help \u003Chelp>\n            See the help.\n            --help=short is the list of easy options and address types\n            --help=long lists all options and types (see [A] markers)\n            --help=doc also shows longer description and examples.\n        --inhibit-pongs \u003Cinhibit_pongs>\n            [A] Stop replying to incoming WebSocket pings after specified number of replies\n\n        --just-generate-accept \u003Cjust_generate_accept>\n            [A] Just a Sec-WebSocket-Accept value based on supplied Sec-WebSocket-Key value without running main\n            Websocat\n        --lengthprefixed-nbytes \u003Clengthprefixed_header_bytes>\n            [A] Use this number of length header bytes for `lengthprefixed:` overlay. [default: 4]\n\n        --max-messages \u003Cmax_messages>\n            Maximum number of messages to copy in one direction.\n\n        --max-messages-rev \u003Cmax_messages_rev>\n            Maximum number of messages to copy in the other direction.\n\n        --conncap \u003Cmax_parallel_conns>\n            Maximum number of simultaneous connections for listening mode\n\n        --max-sent-pings \u003Cmax_sent_pings>\n            [A] Stop sending pings after this number of sent pings\n\n        --max-ws-frame-length \u003Cmax_ws_frame_length>\n            [A] Maximum size of incoming WebSocket frames, to prevent memory overflow [default: 104857600]\n\n        --max-ws-message-length \u003Cmax_ws_message_length>\n            [A] Maximum size of incoming WebSocket messages (sans of one data frame), to prevent memory overflow\n            [default: 209715200]\n        --origin \u003Corigin>                                            Add Origin HTTP header to websocket client request\n        --pkcs12-der \u003Cpkcs12_der>\n            Pkcs12 archive needed to accept SSL connections, certificate and key.\n            A command to output it: openssl pkcs12 -export -out output.pkcs12 -inkey key.pem -in cert.pem\n            Use with -s (--server-mode) option or with manually specified TLS overlays.\n            See moreexamples.md for more info.\n        --pkcs12-passwd \u003Cpkcs12_passwd>\n            Password for --pkcs12-der pkcs12 archive. Required on Mac.\n\n    -p, --preamble \u003Cpreamble>...\n            Prepend copied data with a specified string. Can be specified multiple times.\n\n    -P, --preamble-reverse \u003Cpreamble_reverse>...\n            Prepend copied data with a specified string (reverse direction). Can be specified multiple times.\n\n        --prometheus \u003Cprometheus>\n            Expose Prometheus metrics on specified IP address and port in addition to running usual Websocat session\n\n        --request-header \u003Crequest_headers>...\n            [A] Specify HTTP request headers for `http-request:` specifier.\n\n    -X, --request-method \u003Crequest_method>                            [A] Method to use for `http-request:` specifier\n        --request-uri \u003Crequest_uri>                                  [A] URI to use for `http-request:` specifier\n        --restrict-uri \u003Crestrict_uri>\n            When serving a websocket, only accept the given URI, like `\u002Fws`\n            This liberates other URIs for things like serving static files or proxying.\n    -F, --static-file \u003Cserve_static_files>...\n            Serve a named static file for non-websocket connections.\n            Argument syntax: \u003CURI>:\u003CContent-Type>:\u003Cfile-path>\n            Argument example: \u002Findex.html:text\u002Fhtml:index.html\n            Directories are not and will not be supported for security reasons.\n            Can be specified multiple times. Recommended to specify them at the end or with equal sign like `-F=...`,\n            otherwise this option may eat positional arguments\n        --socks5-bind-script \u003Csocks5_bind_script>\n            [A] Execute specified script in `socks5-bind:` mode when remote port number becomes known.\n\n        --socks5-destination \u003Csocks_destination>\n            [A] Examples: 1.2.3.4:5678  2600:::80  hostname:5678\n\n        --tls-domain \u003Ctls_domain>\n            [A] Specify domain for SNI or certificate verification when using tls-connect: overlay\n\n        --udp-multicast \u003Cudp_join_multicast_addr>...\n            [A] Issue IP[V6]_ADD_MEMBERSHIP for specified multicast address. Can be specified multiple times.\n\n        --udp-multicast-iface-v4 \u003Cudp_join_multicast_iface_v4>...\n            [A] IPv4 address of multicast network interface. Has to be either not specified or specified the same number\n            of times as multicast IPv4 addresses. Order matters.\n        --udp-multicast-iface-v6 \u003Cudp_join_multicast_iface_v6>...\n            [A] Index of network interface for IPv6 multicast. Has to be either not specified or specified the same\n            number of times as multicast IPv6 addresses. Order matters.\n        --udp-ttl \u003Cudp_ttl>                                          [A] Set IP_TTL, also IP_MULTICAST_TTL if applicable\n        --protocol \u003Cwebsocket_protocol>\n            Specify this Sec-WebSocket-Protocol: header when connecting\n\n        --server-protocol \u003Cwebsocket_reply_protocol>\n            Force this Sec-WebSocket-Protocol: header when accepting a connection\n\n        --websocket-version \u003Cwebsocket_version>                      Override the Sec-WebSocket-Version value\n        --binary-prefix \u003Cws_binary_prefix>\n            [A] Prepend specified text to each received WebSocket binary message. Also strip this prefix from outgoing\n            messages, explicitly marking them as binary even if `--text` is specified\n        --ws-c-uri \u003Cws_c_uri>\n            [A] URI to use for ws-c: overlay [default: ws:\u002F\u002F0.0.0.0\u002F]\n\n        --ping-interval \u003Cws_ping_interval>                           Send WebSocket pings each this number of seconds\n        --ping-timeout \u003Cws_ping_timeout>\n            Drop WebSocket connection if Pong message not received for this number of seconds\n\n        --text-prefix \u003Cws_text_prefix>\n            [A] Prepend specified text to each received WebSocket text message. Also strip this prefix from outgoing\n            messages, explicitly marking them as text even if `--binary` is specified\n\nARGS:\n    \u003Caddr1>    In simple mode, WebSocket URL to connect. In advanced mode first address (there are many kinds of\n               addresses) to use. See --help=types for info about address types. If this is an address for\n               listening, it will try serving multiple connections.\n    \u003Caddr2>    In advanced mode, second address to connect. If this is an address for listening, it will accept only\n               one connection.\n\n\nBasic examples:\n  Command-line websocket client:\n    websocat ws:\u002F\u002Fws.vi-server.org\u002Fmirror\u002F\n    \n  WebSocket server\n    websocat -s 8080\n    \n  WebSocket-to-TCP proxy:\n    websocat --binary ws-l:127.0.0.1:8080 tcp:127.0.0.1:5678\n    \n\nFull list of address types:\n\tws:\u002F\u002F           \tInsecure (ws:\u002F\u002F) WebSocket client. Argument is host and URL.\n\twss:\u002F\u002F          \tSecure (wss:\u002F\u002F) WebSocket client. Argument is host and URL.\n\tws-listen:      \tWebSocket server. Argument is host and port to listen.\n\tinetd-ws:       \tWebSocket inetd server. [A]\n\tl-ws-unix:      \tWebSocket UNIX socket-based server. [A]\n\tl-ws-abstract:  \tWebSocket abstract-namespaced UNIX socket server. [A]\n\tws-lowlevel-client:\t[A] Low-level HTTP-independent WebSocket client connection without associated HTTP upgrade.\n\tws-lowlevel-server:\t[A] Low-level HTTP-independent WebSocket server connection without associated HTTP upgrade.\n\twss-listen:     \tListen for secure WebSocket connections on a TCP port\n\thttp:           \t[A] Issue HTTP request, receive a 1xx or 2xx reply, then pass\n\tasyncstdio:     \t[A] Set stdin and stdout to nonblocking mode, then use it as a communication counterpart. UNIX-only.\n\tinetd:          \tLike `asyncstdio:`, but intended for inetd(8) usage. [A]\n\ttcp:            \tConnect to specified TCP host and port. Argument is a socket address.\n\ttcp-listen:     \tListen TCP port on specified address.\n\tssl-listen:     \tListen for SSL connections on a TCP port\n\tsh-c:           \tStart specified command line using `sh -c` (even on Windows)\n\tcmd:            \tStart specified command line using `sh -c` or `cmd \u002FC` (depending on platform)\n\texec:           \tExecute a program directly (without a subshell), providing array of arguments on Unix [A]\n\treadfile:       \tSynchronously read a file. Argument is a file path.\n\twritefile:      \tSynchronously truncate and write a file.\n\tappendfile:     \tSynchronously append a file.\n\tudp:            \tSend and receive packets to specified UDP socket, from random UDP port  \n\tudp-listen:     \tBind an UDP socket to specified host:port, receive packet\n\topen-async:     \tOpen file for read and write and use it like a socket. [A]\n\topen-fd:        \tUse specified file descriptor like a socket. [A]\n\tthreadedstdio:  \t[A] Stdin\u002Fstdout, spawning a thread (threaded version).\n\t-               \tRead input from console, print to console. Uses threaded implementation even on UNIX unless requested by `--async-stdio` CLI option.\n\tunix:           \tConnect to UNIX socket. Argument is filesystem path. [A]\n\tunix-listen:    \tListen for connections on a specified UNIX socket [A]\n\tunix-dgram:     \tSend packets to one path, receive from the other. [A]\n\tabstract:       \tConnect to UNIX abstract-namespaced socket. Argument is some string used as address. [A]\n\tabstract-listen:\tListen for connections on a specified abstract UNIX socket [A]\n\tabstract-dgram: \tSend packets to one address, receive from the other. [A]\n\tmirror:         \tSimply copy output to input. No arguments needed.\n\tliteralreply:   \tReply with a specified string for each input packet.\n\tclogged:        \tDo nothing. Don't read or write any bytes. Keep connections in \"hung\" state. [A]\n\tliteral:        \tOutput a string, discard input.\n\tassert:         \tCheck the input.  [A]\n\tassert2:        \tCheck the input. [A]\n\tseqpacket:      \tConnect to AF_UNIX SOCK_SEQPACKET socket. Argument is a filesystem path. [A]\n\tseqpacket-listen:\tListen for connections on a specified AF_UNIX SOCK_SEQPACKET socket [A]\n\trandom:         \tGenerate random bytes when being read from, discard written bytes.\nFull list of overlays:\n\tws-upgrade:     \tWebSocket upgrader \u002F raw server. Specify your own protocol instead of usual TCP. [A]\n\thttp-request:   \t[A] Issue HTTP request, receive a 1xx or 2xx reply, then pass\n\thttp-post-sse:  \t[A] Accept HTTP\u002F1 request. Then, if it is GET,\n\tssl-connect:    \tOverlay to add TLS encryption atop of existing connection [A]\n\tssl-accept:     \tAccept an TLS connection using arbitrary backing stream. [A]\n\treuse-raw:      \tReuse subspecifier for serving multiple clients: unpredictable mode. [A]\n\tbroadcast:      \tReuse this connection for serving multiple clients, sending replies to all clients.\n\tautoreconnect:  \tRe-establish underlying connection on any error or EOF\n\tws-c:           \tLow-level WebSocket connector. Argument is a some another address. [A]\n\tmsg2line:       \tLine filter: Turns messages from packet stream into lines of byte stream. [A]\n\tline2msg:       \tLine filter: turn lines from byte stream into messages as delimited by '\\\\n' or '\\\\0' [A]\n\tlengthprefixed: \tTurn stream of bytes to\u002Ffrom data packets with length-prefixed framing.  [A]\n\tforeachmsg:     \tExecute something for each incoming message.\n\tlog:            \tLog each buffer as it pass though the underlying connector.\n\tjsonrpc:        \t[A] Turns messages like `abc 1,2` into `{\"jsonrpc\":\"2.0\",\"id\":412, \"method\":\"abc\", \"params\":[1,2]}`.\n\ttimestamp:      \t[A] Prepend timestamp to each incoming message.\n\tsocks5-connect: \tSOCKS5 proxy client (raw) [A]\n\tsocks5-bind:    \tSOCKS5 proxy client (raw, bind command) [A]\n\tcrypto:         \t[A] Encrypts written messages and decrypts (and verifies) read messages with a static key, using ChaCha20-Poly1305 algorithm.\n\tprometheus:     \t[A] Account connections, messages, bytes and other data and expose Prometheus metrics on a separate port.\n\texit_on_specific_byte:\t[A] Turn specific byte into a EOF, allowing user to escape interactive Websocat session\n\twaitfordata:    \tWait for some data to pending being written before starting connecting. [A]\n```\n\u003C\u002Fdetails>\n\n\nSome notes\n---\n\n* IPv6 is supported, surround your IP in square brackets or use it as is, depending on context.\n* Web socket usage is not obligatory, you can use any specs on both sides.\n* Typically one line in binary stream correspond to one WebSocket text message. This is adjustable with options.\n\nLimitations\n---\n\n* It only connects (or serves) HTTP\u002F1. [RFC 8441](https:\u002F\u002Fwww.rfc-editor.org\u002Frfc\u002Frfc8441) or [RFC 9220](https:\u002F\u002Fwww.rfc-editor.org\u002Frfc\u002Frfc9220.html) are not currently supported.\n* It is not convenient when text and binary WebSocket messages are mixed. This affects `mirror:` specifier, making it a bit different from ws:\u002F\u002Fecho.websocket.org. There are `--binary-prefix`, `--text-prefix` and `--base64` options to handle mixture of binary and text.\n* Current version of Websocat don't receive notification about closed sockets. This makes serving without `-E` or `-u` options or in backpressure scenarios prone to socket leak.\n* Readline is not integrated. Users are advices to wrap websocat using [`rlwrap`](https:\u002F\u002Flinux.die.net\u002Fman\u002F1\u002Frlwrap) tool for more convenient CLI.\n* Build process of current version of Websocat is not properly automated and is fragile.\n* Main version (v1) is based on obsolete dependency versions that trigger security warnings and may become tricky to build. There is [new version (v4)](https:\u002F\u002Fgithub.com\u002Fvi\u002Fwebsocat\u002Ftree\u002Fwebsocat4), but is not yet considered stable and [has many missing features](https:\u002F\u002Fgithub.com\u002Fvi\u002Fwebsocat\u002Fissues\u002F276).\n\nBindings\n---\n\n* Node.js: [`seamapi\u002Fnode-websocat`](https:\u002F\u002Fgithub.com\u002Fseamapi\u002Fnode-websocat)\n\nSee also\n---\n\n* [wstunnel](https:\u002F\u002Fgithub.com\u002Ferebe\u002Fwstunnel)\n* [wscat](https:\u002F\u002Fgithub.com\u002Fwebsockets\u002Fwscat)\n* [websocketd](https:\u002F\u002Fgithub.com\u002Fjoewalnes\u002Fwebsocketd)\n* [wsd](https:\u002F\u002Fgithub.com\u002FalexanderGugel\u002Fwsd)\n","websocat 是一个命令行工具，用于WebSocket的连接和服务器搭建，类似于netcat或curl。它支持多种高级功能，如执行外部程序并通过标准输入\u002F输出与WebSocket通信、文本和二进制模式转换、inetd模式以及与Nginx集成等。websocat还提供了自动重连、连接复用等功能，并且支持Linux、Windows和Mac平台。此工具适用于需要通过命令行操作WebSocket的各种场景，比如开发测试、自动化脚本编写及远程调试等。",2,"2026-06-11 03:03:50","top_language"]